Chinaunix首页 | 论坛 | 博客
  • 博客访问: 60119
  • 博文数量: 12
  • 博客积分: 1586
  • 博客等级: 上尉
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-17 13:25
文章分类
文章存档

2012年(1)

2011年(1)

2010年(10)

分类: LINUX

2011-06-07 23:16:00

#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进行++的操作的语句需要加锁,加锁之后运行结果就正确了,但是运行速度会变得慢很多,有待进一步研究
阅读(1147) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~