互斥锁有三种类型:快速锁,嵌套锁(递归锁),检错锁
初始化一个快速锁:
pthread_mutex_t lock;
pthread_mutex_init(&lock,NULL);
加锁:
pthread_mutex_t lock;
pthread_mutex_lock(&lock);
解锁:
pthread_mutex_t lock;
pthread_mutex_unlock(&lock);
使用互斥锁的火车售票:
//使用互斥锁的火车售票
#include<stdio.h>
#include<pthread.h>
int ticketcount=20; //自定义售票数
pthread_mutex_t lock; //宏定义
void *idfun1(void *arg)
{
while(1)
{
pthread_mutex_lock(&lock); // 加锁
if(ticketcount>0)
{
printf("fun1还有%d张票。\n",ticketcount);
sleep(1);
ticketcount--;
}
else
{
pthread_mutex_unlock(&lock); //解锁
pthread_exit(NULL);
}
pthread_mutex_unlock(&lock);
sleep(1); //等待一秒,让另一个有时间锁
}
}
void *idfun2(void *arg)
{
while(1)
{
pthread_mutex_lock(&lock);
if(ticketcount>0)
{
printf("fun2还有%d张票。\n",ticketcount);
sleep(1);
ticketcount--;
}
else
{
pthread_mutex_unlock(&lock);
pthread_exit(NULL);
}
pthread_mutex_unlock(&lock);
sleep(1);
}
}
int main()
{
pthread_t id1; //存放线程标识符
pthread_t id2;
pthread_mutex_init(&lock,NULL);
pthread_create(&id1,NULL,idfun1,NULL); //创建子线程1
pthread_create(&id2,NULL,idfun2,NULL); //创建子线程2
pthread_join(id1,NULL); //等待线程结束
pthread_join(id2,NULL);
pthread_mutex_destroy(&lock); //销毁锁
return 0;
}