C语言 C89的原子等效



所以,我在C89编程,到目前为止,除了一个问题,我做多线程应用程序,我需要使用原子。

我不想切换到C11,因为我希望我的代码在每个编译器和系统上都能兼容,并且我的代码能持续很长时间。

我已经在stackoverflow中搜索了关于这个主题的现有问题,但是没有找到任何问题。

有人知道如何使用C89中的原子吗?假设我有两个线程使用bool

#include <stdatomic.h>
_Atomic bool theBool = false;
void funFromThirstThread()
{
theBool = true;
}
void funFromSecondThread() /*gets called repeatedly*/
{
if(theBool)
{
/*Do something*/
}
}

上面的代码是我在C11中使用原子所做的,但是我如何在C89中做到这一点?这能做到吗?最好不要易失性和锁,谢谢。

不行。

在C11之前,要获得原子操作,必须使用内联汇编器或特定于编译器的内部函数来访问适当的指令。由于该语言没有正式的内存模型,因此您必须依靠特定于编译器的内部知识(通常没有文档记录)来了解它在哪些上下文中可以或不可以执行哪些优化。或者,抛出大量的volatile然后交叉手指。有时两种。没有任何东西是可移植的,微妙的bug很常见。

如果在C11之前有一种可靠和可移植的方法来使用原子,那么C11可能不会费心包括它们。他们这样做有一个很好的理由。

根据评论,你说你正在为线程使用plibsys库,UnholySheep指出它也支持原子。所以你应该用这些。尽管如此,请记住,通用的C89编译器并没有做出任何承诺来避免可能破坏所需内存顺序的优化。通常他们一开始就不够聪明,不会做这样的优化,但是所有的事情都要你自己承担风险。

我不想切换到C11,因为我希望我的代码在每个编译器和系统上兼容,并且我的代码可以持续很长时间。

对于任何比"Hello world"更复杂的程序来说,这个目标基本上是无法实现的。但我的感觉是,使用C11让你更接近,而不是更远。

最新更新