多个线程都需要访问的共享变量,就像两个计算机都访问的双口存储器变量,如果不进行控制有可能会访问出现错误。双口存储器会出现单个访问冲突问题,多线程不会,但是读修改写的原子操作问题两种都会出现。下面就是例子程序,可以通过注释mutex_lock和mutex_unlock看看原子操作出问题的情况,加上锁可以看到正确的情况。
/**************************************
*文件说明:线程冲突
*作者:linchao100
*创建时间:2022年01月13日
*开发环境:ubuntu/g++ v6.3.0
****************************************/
#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>
int global = 0;//定义全局变量
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;//定义全局锁并初始化
void *pthread_add(void *){
int i = 80000;//数据太小,线程发生冲突的概率比较小
while(i--)
{
int tmp = global;
printf("thread:%d,%d\n",pthread_self(),global);
pthread_mutex_lock(&lock);//加锁
global ++;
pthread_mutex_unlock(&lock);//解锁
}
//printf("\n");
return (void *)0 ;
}
int main()
{
pthread_t tid1;
pthread_t tid2;
pthread_create(&tid1,NULL,pthread_add,NULL);//创建线程1
pthread_create(&tid2,NULL,pthread_add,NULL);//创建线程2
pthread_join(tid1,NULL);//等待线程1
pthread_join(tid2,NULL);//等待线程2
printf("the global is %d\n",global);
return 0;
}