1、初始化互斥锁
mutex用pthread_mutex_t数据类型表示,在使用互斥锁前,必须先对它进行初始化。
静态分配的互斥锁:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
动态分配互斥锁:
pthread_mutex_t mutex;
pthread_mutex_init(&mutex,NULL);
销毁互斥锁:
在所有使用过互斥锁的线程都不再需要使用时候,应调用pthread_mutex_destroy销毁互斥锁。
#include<pthread.h>
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
功能:初始化一个互斥锁。
参数:
mutex:互斥锁地址。
attr:互斥锁的属性,NULL为默认的属性。
返回值:
成功:返回 0
失败:返回非 0
2、互斥锁上锁:
互斥锁上锁1
#include<pthread.h>
int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:对互斥锁上锁,若已经上锁,则调用者一直阻塞到互斥锁解锁
参数:
mutex:互斥锁地址。
返回值:
成功:返回 0
失败:返回非 0
互斥锁上锁2
#include<pthread.h>
int pthread_mutex_trylock(pthread_mutex_t *mutex);
功能:对互斥锁上锁,若已经上锁,则上锁失败,函数立即返回。
参数:
mutex:互斥锁地址。
返回值:
成功:返回 0
失败:返回非 0
一般情况下在互斥锁上锁的时候用的是pthread_mutex_lock这个函数。
3、互斥锁解锁:
#include<pthread.h>
int pthread_mutex_unlock(pthread_mutex_t *mutex);
功能:对指定的互斥锁解锁。
参数:
mutex:互斥锁地址。
返回值:
成功:返回 0
失败:返回非 0
4、销毁互斥锁:
#include<pthread.h>
int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能:销毁指定的一个互斥锁。
参数:
mutex:互斥锁地址。
返回值:
成功:返回 0
失败:返回非 0
5、案例代码:
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>
//通过互斥锁解决线程间互斥问题
int money = 10000;
//第一步:创建互斥锁(由于两个线程操作同一个互斥锁,所以定义在全局更加方便一点)
pthread_mutex_t mymutex;
void *pthread_fun1(void *arg)
{
int get,yu,shiji;
get = 10000;
//第三步:对共享资源的操作进行上锁
pthread_mutex_lock(&mymutex);
printf("张三正在查询余额……\n");
sleep(1);
yu =money;
printf("张三正在取钱……\n");
sleep(1);
if(get > yu)
{
shiji = 0;
}
else
{
shiji = get;
yu = yu - get;
money = yu;
}
printf("张三想取%d元,实际取了%d元,余额为%d元\n",get,shiji,yu);
//第四步:当共享资源的操作执行完毕后,对互斥锁执行解锁操作
pthread_mutex_unlock(&mymutex);
pthread_exit(NULL);
}
void *pthread_fun2(void *arg)
{
int get,yu,shiji;
get = 10000;
//第三步:对共享资源的操作进行上锁
pthread_mutex_lock(&mymutex);
printf("李四正在查询余额……\n");
sleep(1);
yu =money;
printf("李四正在取钱……\n");
sleep(1);
if(get > yu)
{
shiji = 0;
}
else
{
shiji = get;
yu = yu - get;
money = yu;
}
printf("李四想取%d元,实际取了%d元,余额为%d元\n",get,shiji,yu);
//第四步:当共享资源的操作执行完毕后,对互斥锁执行解锁操作
pthread_mutex_unlock(&mymutex);
pthread_exit(NULL);
}
int main(int argc,char const *argv[])
{
//第二步:初始化操作
pthread_mutex_init(&mymutex,NULL);
pthread_t thread1,thread2;
if(pthread_create(&thread1,NULL,pthread_fun1,NULL) != 0)
{
perror("fail to pthread_create");
exit(1);
}
if(pthread_create(&thread2,NULL,pthread_fun2,NULL) != 0)
{
perror("fail to pthread_create");
exit(1);
}
pthread_join(thread1,NULL);
pthread_join(thread2,NULL);
//第五步:当互斥锁使用完毕后,要销毁
pthread_mutex_destroy(&mymutex);
return 0;
}
运行结果: