是否有一个(POSIX-)便携式C语言为原子变量的操作方式类似于并行线程便携式线程?
原子操作就像被自动执行,这意味着,没有上下文切换可通过操作干扰“增量并获得”操作。 在Linux内核空间,我们必须atomic_t类型,在Java中我们有java.util.concurrent.atomic中的包。
在Linux上,atomic.h中文件提供原子操作,但包括依赖于平台如#include <asm-x86_64/atomic.h>
,它不适用于Mac OS X上以类似的方式。
是否有一个(POSIX-)便携式C语言为原子变量的操作方式类似于并行线程便携式线程?
原子操作就像被自动执行,这意味着,没有上下文切换可通过操作干扰“增量并获得”操作。 在Linux内核空间,我们必须atomic_t类型,在Java中我们有java.util.concurrent.atomic中的包。
在Linux上,atomic.h中文件提供原子操作,但包括依赖于平台如#include <asm-x86_64/atomic.h>
,它不适用于Mac OS X上以类似的方式。
作为C11的有一个可选的原子库提供原子操作。 这是移植到具有C11编译器(如GCC-4.9)与此可选功能的任何平台。
原子的存在可与被检查__STDC_NO_ATOMICS__
和存在<stdatomic.h>
atomic.c
#include <stdio.h>
#include <stdlib.h>
#ifndef __STDC_NO_ATOMICS__
#include <stdatomic.h>
#endif
int main(int argc, char**argv) {
_Atomic int a;
atomic_init(&a, 42);
atomic_store(&a, 5);
int b = atomic_load(&a);
printf("b = %i\n", b);
return EXIT_SUCCESS;
}
编译器调用
clang -std=c11 atomic.c
gcc -std=c11 atomic.c
对于任何人谁在将来在此跌倒,C11原子能现在做到这一点的最好办法 - 我相信他们会被包含在GCC 4.9。
既然你问了OS X:
(和自交platformity在这个线程提高。)
OS X具有功能OSAtomicAdd32()和朋友。 他们在“/usr/include/libkern/OSAtomic.h”声明。 见线程编程指南 ,部分“使用原子操作”。
和Windows,有InterlockedIncrement()和朋友(请参阅MSDN)。
再加上内建的gcc __sync_fetch_and_add()和朋友(已经被上面链接),你应该有一些对每个主要的桌面平台。
请注意,我并没有通过自己使用它们,但也许会在接下来的几天里这样做。
不,POSIX不指定任何便携式无锁/原子操作。 这就是为什么他们有并行线程。
你要么将不得不使用非标准的方式或ptrheads便携坚持。
C11原子能最小的可运行的例子
随着的glibc 2.28加线程的,我们都可以做原子能和纯C11线程。
例如,从: https://en.cppreference.com/w/c/language/atomic
main.c中
#include <stdio.h>
#include <threads.h>
#include <stdatomic.h>
atomic_int acnt;
int cnt;
int f(void* thr_data)
{
for(int n = 0; n < 1000; ++n) {
++cnt;
++acnt;
// for this example, relaxed memory order is sufficient, e.g.
// atomic_fetch_add_explicit(&acnt, 1, memory_order_relaxed);
}
return 0;
}
int main(void)
{
thrd_t thr[10];
for(int n = 0; n < 10; ++n)
thrd_create(&thr[n], f, NULL);
for(int n = 0; n < 10; ++n)
thrd_join(thr[n], NULL);
printf("The atomic counter is %u\n", acnt);
printf("The non-atomic counter is %u\n", cnt);
}
编译并运行:
gcc -std=c11 main.c -pthread
./a.out
可能的输出:
The atomic counter is 10000
The non-atomic counter is 8644
非原子计数器很可能比原子更小的一个,由于跨线程非原子变量活泼的访问。
:一个并行线程例子,可以发现如何开始在纯C的主题?
:通过从源代码编译的glibc在Ubuntu 18.04(2.27的glibc)测试在单个主机上的多个glibc库
AFAIK有没有跨平台的方式做原子操作。 有可能是一个库在那里,但我不知道的。 它不是特别难推出自己的,虽然。
我不觉得有什么。
解决它的方法之一,许可证允许的当然会是相关的每个架构实现从例如Linux内核空间拷贝。 我没有遵循这些原语的演变密切,但我猜想,他们确实是原语,即不依赖于内核中的其他服务或API。