两个线程,两个互斥锁,怎么形成一个死循环?

问题描述: 两个互斥锁 , 怎么形成一个死循环?
两个线程,两个互斥锁,怎么形成一个死循环?文章插图
粉丝的提问 , 必须安排 。
两个线程 , 两个互斥锁如何形成死锁?程序流程图如下:
两个线程,两个互斥锁,怎么形成一个死循环?文章插图
如上图所示:

  1. t0时刻 , 主线程创建子线程 , 并初始化互斥锁mutex1、mutex2;
  2. t1时刻 , 主线程申请到了mutex1、子线程申请到了mutex2;
  3. t2时刻 , 主线程和子线程都sleep 1秒钟 , 防止优先获得时间片的线程直接申请到了另外1个互斥锁 , 导致程序直接退出;
  4. t3时刻 , 主线程和子线程都想获得对方手里的互斥锁 , 但是对方都来不及释放自己手里的锁;
  5. t4时刻 , 主线程和子线双双进入休眠 。
【两个线程,两个互斥锁,怎么形成一个死循环?】【注意】为了保证主线程和子线程都能够分别获得锁mutex1、mutex2,各自获得锁后一定要先sleep 1秒钟 , 否则创建完子线程后 , 主线程还有一定的时间片 , 主线程会申请到锁mutex2 , 无法形成死锁 。
两个线程,两个互斥锁,怎么形成一个死循环?文章插图
死锁
源码如下#include #include #include #includeunsigned int value1, value2, count;pthread_mutex_tmutex1,mutex2;void *function(void *arg);void*function(void *arg){ pthread_mutex_lock( printf("new thread get mutex2\n");sleep(1); pthread_mutex_lock(printf("new thread get mutex1\n");pthread_mutex_unlock( printf("new thread release mutex1\n"); pthread_mutex_unlock(printf("new thread release mutex2\n");returnNULL; }int main(int argc,char *argv[]){ pthread_ta_thread;if (pthread_mutex_init(exit(-1); }if (pthread_mutex_init(exit(-1); }if (pthread_create(exit(-1); }while ( 1 ){pthread_mutex_lock(printf("main thread get mutex1\n");sleep(1);pthread_mutex_lock(printf("main thread get mutex2\n");pthread_mutex_unlock(printf("main thread release mutex2\n");pthread_mutex_unlock(printf("main thread release mutex1\n");}return 0; }编译运行
两个线程,两个互斥锁,怎么形成一个死循环?文章插图
从执行结果可以判断 , 主线程和子线程分别获得了互斥锁mutex1、mutex2,sleep 1秒后 , 他们都想再分别申请mutex2、mutex1 , 而双方都不想释放自己手中的锁 , 锁已形成了死锁 , 程序就一直处于休眠状态 。
查看下该进程的线程查看进程ID , 为4204
两个线程,两个互斥锁,怎么形成一个死循环?文章插图
查看该进程创建的线程id:4204、4205 。
两个线程,两个互斥锁,怎么形成一个死循环?文章插图
更多嵌入式linux 知识 请关注:一口Linux