#include<stdio.h>
#include<pthread.h>
#define NITERS 100000000
void *count(void *arg);
pthread_mutex_t mutex;
unsigned int cnt=0;
int main(){
pthread_t tid1,tid2;
pthread_create(&tid1,NULL,count,NULL);
printf("1\n");
pthread_create(&tid2,NULL,count,NULL);
printf("2\n");
pthread_join(tid1,NULL);
pthread_join(tid2,NULL);
if(cnt!=(unsigned)NITERS*2){
printf("BOOM cnt=%d\n",cnt);
}
else
printf("OK cnt=%d\n",cnt);
exit(0);
}
void *count(void *arg){
int i;
for(i=0;i<NITERS;i++){
//pthread_mutex_lock(&mutex);
cnt++;
//pthread_mutex_unlock(&mutex);
}
return NULL;
}
|
如果我们去掉加锁的语句,每次输出cnt的值都不一样,因为两个对等线程在单处理器上并发运行,而cnt++这个动作需要多个指令才能完成,也就是不是原子操作,如果中间另外一个线程又执行的话就会产生错误,所以这个对cnt进行++的操作的语句需要加锁,加锁之后运行结果就正确了,但是运行速度会变得慢很多,有待进一步研究
阅读(1183) | 评论(0) | 转发(0) |