multithreading - gcc 中的线程安全原子操作

标签 multithreading gcc atomic

在我开发的一个程序中,我有很多代码如下:

pthread_mutex_lock( &frame->mutex );
frame->variable = variable;
pthread_mutex_unlock( &frame->mutex );

如果中间指令可以用原子存储替换,这显然会浪费 CPU 周期。我知道 gcc 非常有能力做到这一点,但我还没有找到很多关于这种简单的线程安全原子操作的文档。我如何用原子操作替换这组代码?

(我知道简单存储理论上应该是原子的,但我不想希望优化器不会在过程中的某个时刻搞砸它们的原子性。)

澄清:我不需要它们是严格原子的;这些变量仅用于线程同步。也就是说,线程 B 读取该值,检查其是否正确,如果不正确,则休眠。因此,即使线程 A 更新了该值,而线程 B 没有意识到它已更新,这也不是问题,因为这只是意味着线程 B 在不需要时休眠,而当它醒来时,该值将一定要正确。

最佳答案

你可以查看gcc文档。对于当前的 gcc 版本(4.3.2),它将是第 5.47 章 Built-in functions for atomic memory access - 对于其他 gcc 版本,请检查您的文档。它应该在第 5 章 - C 语言家族的扩展中。

顺便说一句,C 编译器绝对不保证简单存储操作是原子的。你不能依赖这个假设。为了使机器操作码能够原子执行,它需要 LOCK 前缀。

关于multithreading - gcc 中的线程安全原子操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/165931/

相关文章:

c++ - 将 gcc 属性与 C++11 属性语法一起使用

使用带 -fPIC 的 dlopen 和 dlsym 编译 C 程序

c - 确保编译器始终使用 SSE sqrt 指令

caching - cuda原子操作可以使用L1缓存吗?

java - 用线程获取素数。如何划分区间?

python - 让Python Socket服务器更高效

javascript - 是否可以从不同的线程调用 JS 函数?

java - 在后台运行线程

c - Linux 上 C 语言的原子操作

c# - 在 ASP.NET Core Web-Api 中用 Interlocked.Exchange(ref oldValue, newValue) 替换不可变数据结构是否安全