这个代码上节我们知道如果进行进程并发执行,那么很可能值不唯一
#include <stdio.h> #include <pthread.h> #include <unistd.h> int ticketAmout = 2; // 票的数量: 全局变量 void* ticketAgent(void* arg){ int t = ticketAmout; if (t > 0){ printf("One ticket sold\n"); t--; }else{ printf("Ticket sold out\n"); } ticketAmout = t; pthread_exit(0); } int main(int argc, char const* agrv[]){ pthread_t ticketAgent_tid[2]; for(int i = 0; i < 2; i++){ pthread_create(ticketAgent_tid+i, NULL, ticketAgent, NULL); } for (int i = 0; i < 2; i++){ pthread_join(ticketAgent_tid[i], NULL); } sleep(1); printf("The left ticket is %d\n", ticketAmout); return 0; }
可以看到因为并发的问题执行结果不唯一
于是我们引入互斥锁来解决上面的问题,主要分三步走:
- pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; //创建一个锁
- pthread_mutex_lock(&lock); //上锁
- pthread_mutex_unlock(&lock); //开锁
#include <stdio.h> #include <pthread.h> #include <unistd.h> int ticketAmout = 2; // 票的数量: 全局变量 pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; void* ticketAgent(void* arg){ // 上锁 pthread_mutex_lock(&lock); int t = ticketAmout; if (t > 0){ printf("One ticket sold\n"); t--; }else{ printf("Ticket sold out\n"); } ticketAmout = t; // 解锁 pthread_mutex_unlock(&lock); pthread_exit(0); } int main(int argc, char const* agrv[]){ pthread_t ticketAgent_tid[2]; for(int i = 0; i < 2; i++){ pthread_create(ticketAgent_tid+i, NULL, ticketAgent, NULL); } for (int i = 0; i < 2; i++){ pthread_join(ticketAgent_tid[i], NULL); } sleep(1); printf("The left ticket is %d\n", ticketAmout); return 0; }
可以看到没有互斥的问题了
死锁的概念
如果一个进程打开了一个锁,但是不去释放这个锁,那么会发生什么呢
我们把释放锁的代码给注释掉
一直再loop根本运行不下去,这就是死锁。