gpt4 book ai didi

c - gcc 原子读写

转载 作者:太空狗 更新时间:2023-10-29 16:12:25 25 4
gpt4 key购买 nike

我有一个多线程应用程序,其中有一个生产者线程(主线程)和多个消费者。

现在从 main 开始,我想知道消费者对工作的投入程度的某种百分比。实现一个计数器很容易,因为它是一个循环完成的工作。然而,由于这个循环重复了几千次,甚至可能超过一百万次。我不想互斥这部分。所以我研究了一些写入 int 的原子选项。

据我所知,我可以使用 gcc 的内置原子函数: https://gcc.gnu.org/onlinedocs/gcc-4.1.2/gcc/Atomic-Builtins.html

但是,它没有只读取我想要处理的变量的功能。

基本上我的问题是。

  1. 我可以从我的生产者安全地读取变量吗,只要我使用原子内置函数写入消费者中的同一个变量

  1. 我需要某种不同的函数来读取变量吗?那是什么功能

最佳答案

定义“安全”。

如果您只是使用常规读取,在 x86 上,对于自然对齐的 32 位或更小的数据,读取是原子的,因此您将始终读取一个有效值,而不是包含一些字节由一个线程写入,一些字节由一个线程写入其他。如果这些事情中的任何一个不正确(不是 x86,不是自然对齐,大于 32 位...)所有赌注都将关闭。

也就是说,您无法保证读取的值会特别新鲜,或者在多次读取中看到的值序列将以任何特定顺序排列。我已经看到天真的代码使用 volatile 来阻止编译器优化读取,但没有其他同步机制,实际上从未看到由于 CPU 缓存而更新的值。

如果这些事情中的任何一件对你来说很重要,而且它们确实应该如此,你应该明确地使读取成为原子操作并使用适当的内存屏障。您引用的内在函数会为您处理这两件事:您可以调用其中一个原子内在函数,这样除了返回值外没有任何副作用:

__sync_val_compare_and_swap(ptr, 0, 0)

__sync_add_and_fetch(ptr, 0)

__sync_sub_and_fetch(ptr, 0)

或其他

关于c - gcc 原子读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24149151/

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