gpt4 book ai didi

16位对象数组的memcpy可以在两者之间中断吗

转载 作者:行者123 更新时间:2023-12-04 14:57:39 24 4
gpt4 key购买 nike

全局数据:

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 操作只在偶数字节的 block 之间被中断,我认为这是安全的。

平台:仅限 x86 和 x86-64(实际上仅限 Intel i7 处理器或更新版本)
操作系统:Linux
编译器:gcc

最佳答案

这取决于 memcpy() 的实现——没有任何保证。即使您知道该实现使它安全,依赖它仍然是不明智的,因此在所有版本和平台上都可能会重复使用此代码或模式。

您可以使用您知道是原子的单词副本来实现您自己的逐字 16 位副本。如何做到这一点需要一个新问题。

关于16位对象数组的memcpy可以在两者之间中断吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67646986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com