91视频免费?看_蜜芽MY188精品TV在线观看_国产免费无遮挡在线观看视频_深夜国产_亚洲精品欧洲精品_欧美黑人粗暴多交

一口Linux
認(rèn)證:優(yōu)質(zhì)創(chuàng)作者
所在專題目錄 查看專題
Linux中常見同步和互斥機(jī)制設(shè)計(jì)原理
Linux信號(hào)量(1)-SYSTEM V
Linux信號(hào)量(2)-POSIX 信號(hào)量
Linux信號(hào)量(3)-內(nèi)核信號(hào)量
兩個(gè)線程,兩個(gè)互斥鎖,怎么形成一個(gè)死循環(huán)?
Linux庫(kù)概念,動(dòng)態(tài)庫(kù)和靜態(tài)庫(kù)的制作,如何移植第三方庫(kù)
作者動(dòng)態(tài) 更多
某通信公司筆試題,你會(huì)做幾道?
2天前
10種初學(xué)者最常見的c語(yǔ)言段錯(cuò)誤實(shí)例及原因分析
05-30 12:13
linux系統(tǒng)監(jiān)控工具小神器:btop
05-17 17:37
有沒有權(quán)貴開后門讓子女做軟件開發(fā)人員?
05-10 23:36
一文包你學(xué)會(huì)網(wǎng)絡(luò)數(shù)據(jù)抓包
03-15 09:26

兩個(gè)線程,兩個(gè)互斥鎖,怎么形成一個(gè)死循環(huán)?

粉絲的提問,必須安排。

兩個(gè)線程,兩個(gè)互斥鎖如何形成死鎖?

程序流程圖如下:

程序流程圖

如上圖所示:

  1. t0時(shí)刻,主線程創(chuàng)建子線程,并初始化互斥鎖mutex1、mutex2;
  2. t1時(shí)刻,主線程申請(qǐng)到了mutex1、子線程申請(qǐng)到了mutex2;
  3. t2時(shí)刻,主線程和子線程都sleep 1秒鐘,防止優(yōu)先獲得時(shí)間片的線程直接申請(qǐng)到了另外1個(gè)互斥鎖,導(dǎo)致程序直接退出;
  4. t3時(shí)刻,主線程和子線程都想獲得對(duì)方手里的互斥鎖,但是對(duì)方都來不及釋放自己手里的鎖;
  5. t4時(shí)刻,主線程和子線雙雙進(jìn)入休眠。

【注意】為了保證主線程和子線程都能夠分別獲得鎖mutex1、mutex2,各自獲得鎖后一定要先sleep 1秒鐘,否則創(chuàng)建完子線程后,主線程還有一定的時(shí)間片,主線程會(huì)申請(qǐng)到鎖mutex2,無(wú)法形成死鎖。

死鎖

源碼如下

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>   

unsigned int value1, value2, count;
pthread_mutex_t  mutex1,mutex2;
void *function(void *arg);


void  *function(void *arg)
{
 pthread_mutex_lock(&mutex2);
 printf("new thread get mutex2\n"); 
 sleep(1);
 pthread_mutex_lock(&mutex1); 
 printf("new thread get mutex1\n"); 
 
 
 pthread_mutex_unlock(&mutex1);
 printf("new thread release mutex1\n");
 pthread_mutex_unlock(&mutex2); 
 printf("new thread release mutex2\n");
    return  NULL;
 }  

int main(int argc,  char *argv[])
{
 pthread_t  a_thread;
         
 if (pthread_mutex_init(&mutex1, NULL) < 0)
 {
  perror("fail to mutex_init");
  exit(-1);
 }
  if (pthread_mutex_init(&mutex2, NULL) < 0)
 {
  perror("fail to mutex_init");
  exit(-1);
 }              
 if (pthread_create(&a_thread, NULL, function, NULL) < 0)
 {   
  perror("fail to pthread_create");     
  exit(-1);
 }
    while ( 1 )
    {
        pthread_mutex_lock(&mutex1);
  printf("main thread get mutex1\n");
  sleep(1);
        pthread_mutex_lock(&mutex2);  
  printf("main thread get mutex2\n");
        pthread_mutex_unlock(&mutex2);
  printf("main thread release mutex2\n");
        pthread_mutex_unlock(&mutex1);
  printf("main thread release mutex1\n");
    }
    return 0;
 } 

編譯運(yùn)行

從執(zhí)行結(jié)果可以判斷,主線程和子線程分別獲得了互斥鎖mutex1、mutex2,sleep 1秒后,他們都想再分別申請(qǐng)mutex2、mutex1,而雙方都不想釋放自己手中的鎖,鎖已形成了死鎖,程序就一直處于休眠狀態(tài)。

查看下該進(jìn)程的線程

查看進(jìn)程ID,為4204

查看該進(jìn)程創(chuàng)建的線程id:4204、4205。

聲明:本內(nèi)容為作者獨(dú)立觀點(diǎn),不代表電子星球立場(chǎng)。未經(jīng)允許不得轉(zhuǎn)載。授權(quán)事宜與稿件投訴,請(qǐng)聯(lián)系:editor@netbroad.com
覺得內(nèi)容不錯(cuò)的朋友,別忘了一鍵三連哦!
贊 2
收藏 1
關(guān)注 181
成為作者 賺取收益
全部留言
0/200
成為第一個(gè)和作者交流的人吧
主站蜘蛛池模板: 巧家县| 五原县| 永宁县| 乌恰县| 乐亭县| 华安县| 定远县| 西充县| 拉萨市| 宜宾县| 迭部县| 茌平县| 平安县| 辽中县| 临澧县| 竹北市| 仪征市| 桐庐县| 汾阳市| 安丘市| 兴山县| 济宁市| 武隆县| 潞西市| 柯坪县| 彭州市| 那曲县| 义乌市| 个旧市| 武穴市| 衡山县| 庄浪县| 江阴市| 钟山县| 怀柔区| 宣武区| 新营市| 门源| 十堰市| 安徽省| 徐汇区|