mutex(互斥量)
在大部分情况下,线程使用的数据都是局部变量,那么变量的地址空间在线程栈的空间内,这样的变量属于单一线程,而其它的线程是无法访问的.那么,线程间通信就是要访问相同的资源,从而完成线程间的交互.
可是,很多个线程并发的操作某个资源时,就会带来一些问题:
例如:下面是一个简单的购票系统.
#include <stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
int Total_Ticket = 100;
void* Entry(void* arg)
{
int64_t id = (int64_t)arg;
while(1)
{
if(Total_Ticket > 0)
{
usleep(1000);
printf("now ticket is %d,%lu is buying ticket\n",Total_Ticket,id);
--Total_Ticket;
}
else
{
break;
}
}
return NULL;
}
int main()
{
pthread_t t[4];
int64_t i = 0;
for(i = 0;i < 4;++i)
{
pthread_create(&t[i],NULL,Entry,(void*)i);
}
for(i = 0;i < 4;++i)
{
pthread_join(t[i],NULL);
}
return 0;
}
运行结果:
从上述图片中可以发现:多个线程同时访问一个全局变量存在较大的问题.
问题:
- 在Entry函数中,当if条件判断为真后,代码可能会被并发的切换到其它线程.
- 在usleep这个等待过程中,可能会有多个线程进入改代码块.
- –Total_Ticket不是一个原子操作.(①将共享变量Total_Ticket加载到寄存器中;②将寄存器中的值进行减一操作③将寄存器中的新值写回到共享变量对应的地址中)
因此:为了解决上述的问题,引进了互斥量: