目录
简介:使用互斥量来确保同时仅有一个线程可以访问某项共享资源。
互斥量的两种状态:已锁定(locked)和未锁定(unlocked)
一旦线程锁定互斥量,随即成为该互斥量的所有者,只有所有者才能给互斥量解锁。
特殊情形:死锁
当超过一个线程加锁同一组互斥量,就有可能发生死锁
死锁的几种场景
1.忘记释放锁
2.重复加锁
3.多线程多锁,抢占锁资源

互斥量的类型 pthread_mutex_t
int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
-功能:初始化互斥量
- 参数 :
- mutex : 需要初始化的互斥量变量
- attr : 互斥量相关的属性,NULL
- restrict : C语言的修饰符,被修饰的指针,不能由另外的一个指针进行操作。
pthread_mutex_t *restrict mutex = xxx;
pthread_mutex_t * mutex1 = mutex
int pthread_mutex_destroy(pthread_mutex_t *mutex);
-功能:释放互斥量的资源
int pthread_mutex_lock(pthread_mutex_t *mutex);
-功能:加锁,阻塞的,如果有一个线程加锁了,那么其他的线程只能阻塞等待
int pthread_mutex_trylock(pthread_mutex_t *mutex);
-功能:尝试加锁,如果加锁失败,不会阻塞,会直接返回
int pthread_mutex_unlock(pthread_mutex_t *mutex);
-功能:解锁
三个线程对票这个共享资源进行操作
- #include
- #include
- #include
- //全局变量,所有的线程都共享这一份资源
- int tickets=1000;
-
- //创建一个互斥量
- pthread_mutex_t mutex;
-
- void *sellticket(void *arg){
- while(1){
- //加锁
- pthread_mutex_lock(&mutex);
- if(tickets>0){
- usleep(60000);
- printf("%ld 正在卖第 %d 张门票\n",pthread_self(),tickets);
- tickets--;
- }else{
- //解锁
- pthread_mutex_unlock(&mutex);
- break;
- }
- //解锁
- pthread_mutex_unlock(&mutex);
- }
- return NULL;
- }
- int main(){
- //初始化互斥量
- pthread_mutex_init(&mutex,NULL);
-
- //创建3个子线程
- pthread_t tid1,tid2,tid3;
- pthread_create(&tid1,NULL,sellticket,NULL);
- pthread_create(&tid2,NULL,sellticket,NULL);
- pthread_create(&tid3,NULL,sellticket,NULL);
-
- //回收子线程的资源,阻塞函数
- pthread_join(tid1,NULL);
- pthread_join(tid2,NULL);
- pthread_join(tid3,NULL);
-
- //退出主线程
- pthread_exit(NULL);
-
- //回收互斥量资源
- pthread_mutex_destroy(&mutex);
- return 0;
- }