在多线程应用中,所有的线程都是共享资源,线程时并发运行的,此时,就有可能发导致多个线程同时访问操作共享资源。假如有AB两个线程,A线程读共享资源,B线程写共享资源,就会发生A线程读取的共享资源一部分被B线程修改过一部分没有修改,那么在这种情况下就是一个数据的混乱,通常数据要么是原始数据,要么是经过完成修改后的数据,而多线程的并发行就可能产生访问的资源还没有被全部修改完毕,就被读取了。
经典案例:有两个编号为1,2的线程,共同售票100张,票号从1到100,
输出每个线程所售票的票号。
#include<stdio.h>
#include<pthread.h>
#include<assert.h>
#include<unistd.h>
#include<stdlib.h>
pthread_mutex_tmutex;//定义互斥锁
int tickets=1;
void*saleTicket(void*argv)
{
int id=(int)argv;
while(1)
{
//pthread_mutex_lock(&mutex);//上锁
if(tickets<=100)
{
usleep(5);
printf("第%d窗口售票:%d号\n",id,tickets++);
// pthread_mutex_unlock(&mutex);//解锁
}
else
{
//pthread_mutex_unlock(&mutex);//解锁
break;
}
}
pthread_exit(NULL);
}
int main()
{
pthread_t pth1,pth2;
int ret;
//初始化互斥锁
pthread_mutex_init(&mutex,NULL);
ret=pthread_create(&pth1,NULL,saleTicket,(void*)1);
assert(ret==0);
ret=pthread_create(&pth2,NULL,saleTicket,(void*)2);
assert(ret==0);
pthread_join(pth1,NULL);
pthread_join(pth2,NULL);
pthread_mutex_destroy(&mutex);//销毁互斥锁
return 0;
}
如果将代码中的互斥锁的上锁和解锁去掉(usleep是为了增加出错的几率),就会可能出现票号101的情形,这种错误是及其致命的,不允许发生。此时使用互斥锁就会解决这种问题所带来的错误。