最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

單線程會導(dǎo)致死鎖你知道嗎

 更新時間:2022年02月17日 17:34:36   作者:寫代碼的籃球球癡  
這篇文章主要為大家詳細介紹了單線程會不會導(dǎo)致死鎖,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助

死鎖從文字理論上說明的是兩個線程,可以認為是兩個人A和B,A在等待B完成某件事情,B又在等待A完成某件事情。

0422692999f4e81a98b7fe4c8a68e21e.png

那如果在代碼中,單線程的某個函數(shù),有沒有可能導(dǎo)致死鎖呢?

我們看下面的代碼

#include<pthread.h>
#include<string.h>
#include<errno.h>
#include<stdio.h>
#include<unistd.h> 
pthread_mutex_t mutex;
int main()
{
    pthread_mutex_init(&mutex,NULL);
    printf("mutex init\n");
    pthread_mutex_lock(&mutex);
    printf("mutex lock#1\n");
    pthread_mutex_lock(&mutex);
    printf("mutex lock#2\n");
    pthread_mutex_unlock(&mutex);
    pthread_mutex_unlock(&mutex);
    pthread_mutex_destroy(&mutex);
    return 0; 
}

你看這樣的代碼會不會導(dǎo)致死鎖呢?

線程在上鎖后,又馬上繼續(xù)嘗試上鎖,這樣的情況會不會存在?

類似這樣的代碼

int test_function(void)
{
  //lock
  do_something()
  if(x) return -1
  //unlock
}

在上鎖后,然后下面會因為某種判斷后退出,下一次進來后,又會進行上鎖,這樣的死鎖是因為代碼邏輯不正確導(dǎo)致的,也是很多新手常犯的問題。

如果是兩個線程死鎖的情況呢?

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t g_mutex_lock;
pthread_mutex_t g_mutex_lock2;
void *func1(void* args)
{
    printf("%s(),LINE=%d\n",__FUNCTION__,__LINE__);
    pthread_mutex_lock(&g_mutex_lock);
    sleep(1);
    pthread_mutex_lock(&g_mutex_lock2);
    printf("%s(),LINE=%d\n",__FUNCTION__,__LINE__);
    pthread_mutex_unlock(&g_mutex_lock);
    pthread_mutex_unlock(&g_mutex_lock2);
    return NULL;
}
void *func2(void* args)
{
    printf("%s(),LINE=%d\n",__FUNCTION__,__LINE__);
    pthread_mutex_lock(&g_mutex_lock2);
    sleep(1);
    pthread_mutex_lock(&g_mutex_lock);
    printf("%s(),LINE=%d\n",__FUNCTION__,__LINE__);
    pthread_mutex_unlock(&g_mutex_lock2);
    return NULL;
}
int main(void)
{
    int ret;
    pthread_t thread_1;
    pthread_t thread_2;
    printf("%s(),LINE=%d\n",__FUNCTION__,__LINE__);
    ret = pthread_mutex_init(&g_mutex_lock, NULL);
    if (ret != 0) {
        printf("mutex init failed\n");
        return -1;
    }
    ret = pthread_mutex_init(&g_mutex_lock2, NULL);
    if (ret != 0) {
        printf("mutex2 init failed\n");
        return -1;
    }
    pthread_create(&thread_1, NULL, func1, NULL);
    pthread_create(&thread_2, NULL, func2, NULL);
    pthread_join(thread_1, NULL);
    pthread_join(thread_2, NULL);
    pthread_mutex_destroy(&g_mutex_lock);
    pthread_mutex_destroy(&g_mutex_lock2);
    printf("%s(),LINE=%d\n",__FUNCTION__,__LINE__);
    return 0;
}

上面的代碼比較典型了

線程1拿到1號鎖后,開始等待2號鎖,線程2拿到2號鎖后,就開始等待一號鎖。他們屬于互相等待的情況。

代碼輸出

linux@ubuntu:/study$ gcc argc.c -pthread && ./a.out
main(),LINE=37
func1(),LINE=11
func2(),LINE=23

最后,線程出現(xiàn)死鎖不會正常情況不會導(dǎo)致crash,除非代碼上因為加鎖存在的一些空指針。

所以單線程也是有可能導(dǎo)致死鎖的。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!    

相關(guān)文章

  • Vscode中接入Deepseek的實現(xiàn)

    Vscode中接入Deepseek的實現(xiàn)

    本文主要介紹了Vscode中接入Deepseek的實現(xiàn),包括登錄Deepseek官網(wǎng)、申請APIKEY、安裝和配置VSCode插件,具有一定的參考價值,感興趣的可以了解一下
    2025-02-02
  • 關(guān)于C++多重繼承下虛表結(jié)構(gòu)的問題

    關(guān)于C++多重繼承下虛表結(jié)構(gòu)的問題

    這篇文章主要介紹了C++ 多重繼承下虛表結(jié)構(gòu)的問題,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • C++中圖片重命名實現(xiàn)代碼

    C++中圖片重命名實現(xiàn)代碼

    這篇文章主要介紹了C++中圖片重命名實現(xiàn)代碼,需要的朋友可以參考下
    2017-05-05
  • 深入理解C++中std::chrono庫的使用

    深入理解C++中std::chrono庫的使用

    在程序設(shè)計中,時間管理是一個核心概念,它不僅關(guān)系到程序的效率和性能,而且直接影響用戶體驗,C++作為一門高效的編程語言,提供了std::chrono庫,用于精確地處理和計算時間,下面就跟隨小編一起學(xué)習(xí)一下std::chrono庫的使用吧
    2023-12-12
  • C語言通過三種方法實現(xiàn)屬于你的通訊錄

    C語言通過三種方法實現(xiàn)屬于你的通訊錄

    本文將實現(xiàn)一個通訊錄,來實現(xiàn)人員的增刪插改功能。文中通過三種形式來實現(xiàn)用戶的增刪插改,其實也就是一點點的優(yōu)化版本,從靜態(tài)的實現(xiàn),到動態(tài)的實現(xiàn),最后以文件的形式來完成,請大家和我一起往下看吧
    2022-11-11
  • C++實現(xiàn)N個骰子的點數(shù)算法

    C++實現(xiàn)N個骰子的點數(shù)算法

    這篇文章主要介紹了C++實現(xiàn)N個骰子的點數(shù)算法,用兩種方法實現(xiàn)了該功能,是非常實用的技巧,需要的朋友可以參考下
    2014-09-09
  • C++超詳細實現(xiàn)二叉樹的遍歷

    C++超詳細實現(xiàn)二叉樹的遍歷

    本章將會詳細講解二叉樹遍歷的四種方式,分別為前序遍歷、中序遍歷、后續(xù)遍歷和層序遍歷。在學(xué)習(xí)遍歷之前,會先帶大家回顧一下二叉樹的基本概念
    2022-05-05
  • C++中vector迭代器失效與深淺拷貝問題詳析

    C++中vector迭代器失效與深淺拷貝問題詳析

    迭代器失效就是迭代器底層對應(yīng)指針?biāo)赶虻目臻g倍銷毀了,導(dǎo)致使用了一塊已經(jīng)被釋放了的空間,下面這篇文章主要給大家介紹了C++中vector迭代器失效與深淺拷貝問題的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • Qt自定義表頭實現(xiàn)過濾功能的方法

    Qt自定義表頭實現(xiàn)過濾功能的方法

    這篇文章主要個給大家介紹了關(guān)于Qt自定義表頭實現(xiàn)過濾功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Qt具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-07-07
  • C++實現(xiàn)順序表的常用操作(插入刪出查找輸出)

    C++實現(xiàn)順序表的常用操作(插入刪出查找輸出)

    實現(xiàn)順序表的插入,刪除,查找,輸出操作在C語言中經(jīng)常用到。下面小編給大家整理實現(xiàn)代碼,一起看下吧
    2016-08-08

最新評論

井研县| 平遥县| 陇川县| 肥城市| 兴化市| 涟水县| 巴林左旗| 临海市| 北碚区| 洪江市| 界首市| 奈曼旗| 称多县| 垫江县| 邹城市| 赫章县| 洪泽县| 惠来县| 保定市| 沾化县| 军事| 永仁县| 竹山县| 屯门区| 出国| 河南省| 白朗县| 三门峡市| 房产| 泉州市| 嘉黎县| 彩票| 武城县| 正宁县| 正阳县| 理塘县| 景宁| 长汀县| 遂川县| 五华县| 梧州市|