以下代码为n和v都产生随机值,这并不奇怪,n是没有被正确保护的随机值.但是假设v应该终于为0.我的代码有什么问题吗?还是有人可以为我解释一下吗?谢谢.
我正在开发x86架构的4核服务器. 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编译的.
没有了,汇编代码输出没有锁前缀,你可以发现你的内核相互干扰.
但是我会使用pthread函数,因为它们可以在更多的平台上移植.