gpt4 book ai didi

c - 原子操作-C

转载 作者:行者123 更新时间:2023-12-04 09:37:52 25 4
gpt4 key购买 nike

是否可以让两个变量以原子方式递增。我有以下代码,由于它是一个多处理器、多线程环境,缓存失效成为性能瓶颈。所以,我试图尽量减少原子操作的数量。

__sync_add_and_fetch(&var1,1);
__sync_add_and_fetch(&var2,1);

我看到第一个参数是一个指针,是否可以通过使用结构来实现我的情况?

P.S:我不能使用锁。

最佳答案

原子操作非常特殊,只能提供有限的支持。将它们应用于两个变量对我来说听起来是不可能的。

请注意,甚至不能保证原子操作确实是通过 resp 完成的。原子操作(即机器代码命令)。

出 gcc 文档。 5.47 Built-in functions for atomic memory access :

Not all operations are supported by all target processors. If a particular operation cannot be implemented on the target processor, a warning will be generated and a call an external function will be generated. The external function will carry the same name as the builtin, with an additional suffix '_n' where n is the size of the data type.



外部函数可能使用互斥锁模拟原子操作。

但我想,“肮脏的黑客”是可能的,并且只有某些限制:

如果 16 位无符号计数器就足够了,您可以将其中的两个放在一个 32 位变量中,其中 c1c2 += 0x00000001增加一, c1c2 += 0x00010000增加另一个,和 c1c2 += 0x00010001增加两者
或使用原子操作:
/* combined counters c1 and c2 */
static uint32_t c1c2 = 0;

/* count c1 atomically */
__sync_fetch_and_add(&c1c2, 0x00000001);
/* count c2 atomically */
__sync_fetch_and_add(&c1c2, 0x00010000);
/* count c1 AND c2 atomically */
__sync_fetch_and_add(&c1c2, 0x00010001);

这必须与适当的位移位和屏蔽相结合才能访问各个计数器值。

当然,计数器溢出可能是一个问题。这同样适用于 64 位平台上的两个 32 位计数器(考虑到原子操作通常仅适用于“机器字”宽度)。

顺便提一句。在谷歌搜索背景信息时,我偶然发现了这个: Why does __sync_add_and_fetch work for a 64 bit variable on a 32 bit system? .我发现原子操作可能需要足够的变量对齐才能正常工作的提示(我发现值得一提)。

这可能是 C11 Atomic Library 的原因为原子变量提供专用类型(例如 atomic_uint_least32_t )。

关于c - 原子操作-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44691392/

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