互斥锁相关的API
互斥量从本质上来说是一把锁,在访问共享资源前对互斥量进行加锁,在访问完成后释放互斥量上的锁。对互斥量进行加锁后。任何其他试图再次对互斥量加锁的线程将会被阻塞知道当前线程释放该互斥锁。如果释放互斥锁时有多个线程阻塞,所以在互斥锁上的阻塞线程都会变成可运行状态,第一个变为可运行状态的线程可以对互斥量加锁,其他线程将会看到互斥锁依然被锁住,只能回去等待它重新变为可用。在这种方式下,每次只有一个线程可以向前运行。
锁的作用是:被锁上的代码,一旦进入这个代码肯定是保证里面的代码先执行以后,其他的线程才可以走,因为在这个线程执行的时候,其他线程也想获得这个锁,但是这个锁并没有被释放,在代码执行完以后才能释放。加锁与解锁之间的代码又叫做共享资源
什么情况下会造成死锁
前提条件是要有两个锁,当线程A获得一把锁的时候,想要获得另外一把锁。而线程B手里获得了线程A想要的锁,同时也想去获得线程A已经获得的锁,导致线程A、B都想得到对方已获得的锁,导致两个线程都获得不了
1、创建及销毁互斥锁
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr); // 互斥锁的初始化
int pthread_mutex_destroy(&mutex); //互斥锁的销毁
返回值:成功返回0,失败返回错误编码
2、加锁及解锁
int phread_mutex_lock(&mutex);
int phread_mutex_unlock(&mutex);
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
pthread_mutex_t mutex; //定义锁的全局变量
void *func1(void *arg){
int i;
pthread_mutex_lock(&mutex); //对t1锁上
for(i=0;i<3;i++){
printf("t1:%ld thread is created\n",(unsigned long)pthread_self());
printf("t1:param is %d\n",*((int *)arg));
sleep(1);
}
pthread_mutex_unlock(&mutex); //执行完可执行代码后对t1解锁
}
void *func2(void *arg){
pthread_mutex_lock(&mutex);
printf("t2:%ld thread is created\n",(unsigned long)pthread_self());
printf("t2:param is %d\n",*((int *)arg));
pthread_mutex_unlock(&mutex);
}
int main()
{
int ret;
pthread_t t1;
pthread_t t2;
int param = 100;
pthread_mutex_init(&mutex, NULL); //锁的初始化
// int *pret;
ret = pthread_create(&t1,NULL,func1,(void *)¶m);
if(ret == 0){
printf("main:create t1 success \n");
}
ret = pthread_create(&t2,NULL,func2,(void *)¶m);
if(ret == 0){
printf("main:create t1 success \n");
}
printf("main :%ld\n",(unsigned long)pthread_self());
pthread_join(t1,NULL);
pthread_join(t2,NULL);
pthread_mutex_destroy(&mutex); //锁的销毁
return 0;
}
19,1 Top