c - 16位对象数组的memcpy可以在两者之间中断吗
问题描述
全球数据:
uint16_t global_buffer[128];
线程 1:
uint16_t local_buffer[128];
while(true)
{
...
if(data_ready)
memcpy(global_buffer, local_buffer, sizeof(uint16_t)*128);
}
线程 2:
void timer_handler()
{
uint16_t value = global_buffer[10];
//do something with value
}
我的问题是这样做是否安全?我的意思是,是否保证value
将获得旧值或新值(如果线程 1 memcpy() 被上下文切换中断)?在更新 16 位值的一个字节而不是第二个字节后,memcpy 是否有可能被中断。在那种情况下,value
将是垃圾。
如果 memcpy 操作仅在偶数字节块之间被中断,我认为这是安全的。
平台:仅 x86 和 x86-64(实际上只有 Intel i7 处理器或更新版本)
操作系统:Linux
编译器:gcc
解决方案
这将取决于实施memcpy()
- 没有保证。即使您知道该实现使这变得安全,仍然依赖它是不明智的,因此在所有版本和平台上,此代码或模式可能会被重用。
您可以使用您知道是原子的单词副本来实现自己的逐字 16 位副本。如何做到这一点值得提出一个新问题。
推荐阅读
- django - 我的注册表单没有在 django 中提交
- python - 将十六进制转储转换为 ASCII
- javascript - discord.js v12:我如何等待 DM 频道中的消息?
- c# - 如何使我的自定义数据类型与泛型类一起使用?
- javascript - 有没有一种简单的方法来创建数据库?
- sql - SQL 从查询中填充新表
- javascript - 从 Google Apps 脚本中的 api 解析 JSON 响应
- openmdao - 由于有限差分步长,区分不正确的小部分和不匹配的正确部分
- python - 如何在排序列表中找到条件最接近的值
- sql - 内连接上的内连接 - 多次指定列