Linux环境下线程的互斥

多个线程同时访问共享数据时可能会冲突,这跟前面讲信号时所说的可重入性是同样的问
题。比如 两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成:
1. 从内存读变量值到寄存器
2. 寄存器的值加1
3. 将寄存器的值写回内存
假设两个线程在多处理器平台上同时执行这三条指令,则可能导致下图所示的结果,最后变量
只加了一次而非两次。

通过一个简单的程序观察这一现象。描述的现象从理论上是存在这种可能的,但实际运行程序时很难观察到,为了使现象更容易观察到,我们把上述三条指令做的事情用更多条指令来做:
我们在“读取变量的值”和“把变量的新值保存回去”这两步操作之间插入一个printf调用,它会执行write系统调用进内核,为内核调度别的线程执行提供了一个很好的时机。我们在一个循环中重 复上述操作几千次,就会观察到访问冲突的现象。
我们创建两个线程,各自把counter增加5000次,正常情况下最后counter应该等于10000,但事实
上每次运行该程序的结果都不一样,有时候数到5000多,有时候数到6000多。

对于多线程的程序,访问冲突的问题是很普遍的,解决的办法是引入互斥锁(Mutex,Mutual  Exclusive Lock),获得锁的线程可以完成“读-修改-写”的操作,然后释放锁给其它线程,没有获得锁的线程只能等待而不能访问共享数据,这样“读-修改-写”三步操作组成一个原子操作,要么都执行,要么都不执行,不会执行到中间被打断,也不会在其它处理器上并行做这个操作。


#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>


static int count=0;
pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER;
void *thread_run(void *arg)
{

	int val=0;
	int i=0;
	for(;i<5000;i++)
	{
		pthread_mutex_lock(&mutex);//加锁
		val=count;
		printf("pthread id is %d,tid is %d\n",getpid(),pthread_self());
		count=val+1;
		pthread_mutex_unlock(&mutex);//解锁
	//	count++;
	}
	return NULL;
}



int main()
{
	pthread_t id1;
	pthread_t id2;
	int temp1=pthread_create(&id1,NULL,thread_run,NULL);
	int temp2=pthread_create(&id2,NULL,thread_run,NULL);
	if(temp1!=0)
	{
		printf("create thread1 error,%s\n",strerror(temp1));
		return -1;
	}
	if(temp2!=0)
	{
		printf("create thread2 error,%s\n",strerror(temp2));
		return -1;
	}
	pthread_join(id1,NULL);
	pthread_join(id2,NULL);
	printf("count val = %d\n",count);
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值