标签:linux 编程 lock global NULL 线程 pthread mutex 多线程
多个线程都需要访问的共享变量,就像两个计算机都访问的双口存储器变量,如果不进行控制有可能会访问出现错误。双口存储器会出现单个访问冲突问题,多线程不会,但是读修改写的原子操作问题两种都会出现。下面就是例子程序,可以通过注释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;
}
标签:linux,编程,lock,global,NULL,线程,pthread,mutex,多线程 来源: https://blog.csdn.net/m0_57122083/article/details/122468137
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。