来自atomic.h的操作似乎是非primefaces的

下面的代码为n和v生成随机值。n没有受到适当的保护就是随机的,这并不奇怪。 但是应该是v最后应该是0.我的代码有什么问题吗? 或者有人能解释这个吗? 谢谢。

我正在研究x86架构的四核服务器。 uname如下。

Linux 2.6.9-22.ELsmp#1 SMP Mon Sep 19 18:00:54 EDT 2005 x86_64 x86_64 x86_64 GNU / Linux

#include <stdio.h> #include <pthread.h> #include <asm-x86_64/atomic.h> int n = 0; atomic_t v; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; #define LOOP 10000 void* foo(void *p) { int i = 0; for(i = 0; i < LOOP; i++) { // pthread_mutex_lock(&mutex); ++n; --n; atomic_inc(&v); atomic_dec(&v); // pthread_mutex_unlock(&mutex); } return NULL; } #define COUNT 50 int main(int argc, char **argv) { int i; pthread_t pids[COUNT]; pthread_attr_t attr; pthread_attr_init(&attr); atomic_set(&v, 0); for(i = 0; i < COUNT; i++) { pthread_create(&pids[i], &attr, foo, NULL); } for(i = 0; i < COUNT; i++) { pthread_join(pids[i], NULL); } printf("%d\n", n); printf("%d\n", v); return 0; } 

我们可以看看代码的汇编输出(gcc -E,我想)。 即使认为uname表示它是SMP意识,这并不一定意味着它是用CONFIG_SMP编译的。

没有这一点,汇编代码输出没有lock前缀,你可以找到你的核心互相干扰。

但是我会使用pthread函数,因为它们可以在更多的平台上移植。

你应该使用gcc内置代替(见。 这 )这工作得很好,也适用于icc。

 int a; __sync_fetch_and_add(&a, 1); // atomic a++ 

请注意,在不锁定的情况下修改变量时,应该知道缓存一致性问题。

这个老帖子暗示了这一点

  • 你不应该在用户空间程序中包含这个内核头文件
  • 已经知道不能为用户空间程序提供原子性。

所以……也许这就是你看到的问题的原因?

Linux内核的atomic.h在userland中是不可用的,从来没有。 在x86上,其中一些可能工作,因为x86是相当同步友好的体系结构,但在某些平台上,它很大程度上依赖于能够执行特权操作(旧手臂)或至少能够禁用抢占(旧手臂和sparc至少),这是不是在用户的情况下!