1. 程式人生 > >遇到的多執行緒死迴圈問題

遇到的多執行緒死迴圈問題

知乎地址:https://www.zhihu.com/question/276724572/answer/388777540(提問者是本人)

1、當時根據需求實現的,迴圈佇列,讀寫操作不加鎖

2、狀態:0(操作中,不能被讀寫) 1(可讀可寫) -1(可寫不可讀)

3、寫先行,,讀永遠讀寫-1,資料僅僅可以被讀一次,沒讀過的資料是可寫的

4、讀阻塞,必須讀到一個 可讀資料 才可以返回

5、現象 :debug OK,release下 函式readQueue 下的while死迴圈了

void eQueue::readQueue(void **buff)
{
    int read = ((m_nWirte + MAX_NUB - 1) % MAX_NUB);
    while (m_qImage[read]->bRead != 1)
    {
        //Sleep(0.2);
        read = ((m_nWirte + MAX_NUB - 1) % MAX_NUB);
    }
    // Release, not perform
    // Debug or Release add Sleep code,OK
    if (m_fpRead.isOpen())
    {
        m_fpRead.write(" start Read");
    }
}
void eQueue::writeQueue(QImage & image)
{
    int nWrite = m_nWirte;
    //寫執行緒需要不斷去寫
    while (true)
    {
        if (m_fpWrite.isOpen())
        {
            QString qsMsg = QString("m_nWirte: %1, m_nRead: %2, bRead:%3 ,%4\n").arg(nWrite).arg(m_nRead).arg(m_qImage[nWrite]->bRead).arg(QDateTime::currentDateTime().toString("hh:mm:ss-zzz"));
            m_fpWrite.write(qsMsg.toLatin1(), qsMsg.length());
        }

        if (m_qImage[nWrite]->bRead == -1)
        {
            *m_qImage[nWrite]->qImage = image;
            m_nWirte = (nWrite + 1) % MAX_NUB;
            m_qImage[nWrite]->bRead = 1;
            return;
        }
        else
        {
            nWrite = (nWrite + 1) % MAX_NUB;
        }
    }

post下知乎大佬給的解釋,經過測試確實是這樣的


解決方法:1、volatile int              m_nWirte;//共享變數 需要新增語義

                 2、加上執行緒等待(sleep or wait)

相關推薦

遇到的執行迴圈問題

知乎地址:https://www.zhihu.com/question/276724572/answer/388777540(提問者是本人)1、當時根據需求實現的,迴圈佇列,讀寫操作不加鎖2、狀態:0(操作中,不能被讀寫) 1(可讀可寫) -1(可寫不可讀)3、寫先行,,讀永

linux下gdb除錯執行迴圈

1、我們首先要知道是哪個執行緒出了問題:     A、查程序  ps -ef | grep 程序名         B、查執行緒  top -H -p 程序ID 2、gdb檢視  gdb 程序名  程序號 :     A、檢視是哪個執行緒出了問題 (gdb) inf

34-執行--鎖+執行間通訊+等待喚醒機制+生產者消費者問題

一、死鎖 1、死鎖的常見情形之一:同步的巢狀 說明:同步的巢狀,至少得有兩個鎖,且第一個鎖中有第二個鎖,第二個鎖中有第一個鎖。eg:同步程式碼塊中有同步函式,同步函式中有同步程式碼塊。下面的例子,同步程式碼塊的鎖是obj,同步函式的鎖是this。t1執行緒先執行同步程式碼塊,獲取鎖obj,需

Java執行-47-執行

       本篇學習什麼是多執行緒死鎖,怎麼避免執行緒死鎖。這個問題,在面試了應該也經常被提到。關於,執行緒死鎖,有這麼一個故事。一個飯桌上,有豐盛的菜餚,圓桌圍著幾個哲學家,問題來了,每個哲學家只有一根筷子。假如必須得到兩根筷子,才

java 執行 鎖和valitile關鍵字

死鎖 兩個或者多個執行緒都在等待對方釋放鎖,在寫多執行緒程式碼時要注意避免這種死鎖的發生 發生死鎖後可以在dos命令列輸入jps命令檢視java程序狀況 可以試用jstack -l 程序號   命令檢視當前類的問題 關閉jvm停止死鎖   以上節

python中的程序,執行,鎖,協程

本人根據自己的理解來總結的,如果有錯誤的地方還請各位大佬指正,謝謝了. 程序:程式是計算機可執行的二進位制資料,只有被作業系統呼叫的時候才開始它們的生命週期.程序就是程式的一次執行,擁有自己的地址空間,記憶體,程序id(pid),資料棧及其他記錄其執行軌跡的輔助資料;最小的

執行鎖程式碼

public class DeadLock { //建立兩個物件,一個執行緒持有鎖A並且申請獲得鎖B,而另一個執行緒持有鎖B並且申請獲得鎖A就會發生死鎖。 private static final Object A=new Object(); priv

執行鎖的產生以及如何避免

一、死鎖的定義 多執行緒以及多程序改善了系統資源的利用率並提高了系統 的處理能力。然而,併發執行也帶來了新的問題——死鎖。所謂死鎖是指多個執行緒因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些程序都將無法向前推進。 下面我們通過一些例項來說明死鎖現象。 先看生活中

Java執行--三個執行分別列印a,b,c.請用執行實現迴圈列印15次abc

掃盲: 想想自己多執行緒解決生產消費者問題就知道個synchronized,真是慚愧 為做此題目特意學習新的多執行緒知識–ReentrantLock跟synchronized一樣都是Java中的可重入鎖(可以在內部鎖中拿到外部鎖) Con

執行鎖以及解決方法

解決死鎖沒有簡單的方法,這是因為執行緒產生死鎖都各有各的原因,而且往往具有很高的負載。大多數軟體測試產生不了足夠多的負載,所以不可能暴露所有的執行緒錯誤。在這裡中,下面將討論開發過程常見的4類典型的死

java 執行 鎖 哲學家就餐問題

    現在你理解了,一個物件可以有synchronized方法或其他形式的加鎖機制來防止別的任務在互斥還沒有釋放的時候就訪問這個物件。你已經學習過,任務可以變成阻塞狀態,所以就可能出現兩種情況:某個惹我怒在等待另一個任務,而後者又等待別的任務,這樣一直下去,直到這個鏈條上

java學習第十二天之執行鎖和併發

package MoreThreadLearn; /* 兩個儲戶到銀行存錢,每個人存了三次,一次100元 1、描述銀行 2、描述儲戶業務 分析多執行緒是否存在安全隱患? 1、執行緒任務中是否有共享的資料 2、是否多條操作共享資料的程式碼 */ public

執行鎖經典案例,必定會發生死鎖

        Java執行緒死鎖是一個經典的多執行緒問題,因為不同的執行緒都在等待根本不可能被釋放的鎖,從而導致所有的任務都無法繼續完成。換言之只要互相等待對方釋放鎖就有可能出現死鎖。下面將用一個簡單的例子加以說明,如有問題,請多多指教。        某日AB兩位壯士各獲

執行——CyclicBarrier迴圈屏障

概述 CyclicBarrier是一個同步工具類,可以翻譯成迴圈屏障,也叫障礙器或同步屏障。 CyclicBarrier內部有一個計數器count,呼叫障礙器的await方法會使計數器count的值減一,當計數器count的值為0時,表明呼叫了await方法執行緒已經達到

執行鎖及解決辦法

死鎖是由於不同執行緒按照不同順序進行加鎖而造成的。如: 執行緒A:對lock a加鎖 => 對lock b加鎖 => dosth => 釋放lock b => 釋放lock a 執行緒B:對lock b加鎖 => 對lock a加鎖 

ios執行鎖解析

問題:ios 誰能分析下多執行緒死鎖問題,感謝,分析圖一二為什麼是這個結果? (問題帖子連結:http://zhidao.baidu.com/link?url=Lr9sNchrdnCLJdoc73WeHfL3lcu7lBvyKQ2hBrF2jbyM3wkJWeK0

一個執行鎖案例,如何避免及解決鎖問題?

多執行緒死鎖在java程式設計師筆試的時候時有遇見,死鎖概念在之前的文章有介紹,大家應該也都明白它的概念,不清楚的去翻看歷史文章吧。 下面是一個多執行緒死鎖的例子 輸出 thread1 get lock1 thread2 get lock2 兩個執行緒相互得到鎖1,鎖2,然後

Visual Studio 效能分析工具 查詢 執行迴圈

同事寫了一個MD5差分包校驗的工具,我在使用的時候發現關閉工具後,工具仍然在後臺執行。因為之前有建議同事開啟子執行緒去做對比壓縮分包,所以估計應該是在子執行緒中有死迴圈。但是我不知道去哪裡尋找這個問題。想起來之前有用過Visual Studio的效能測試工具,說不定可以用來查

執行迴圈柵欄CyclicBarrier及原理

一、迴圈柵欄CyclicBarrier CyclicBarrier它允許一組執行緒互相等待,直到到達某個公共屏障點 (common barrier point)。在涉及一組固定大小的執行緒的程式中,這些執行緒必須不時地互相等待。因為該 barrier 在釋放等待執行緒後可

Python | 執行鎖問題的巧妙解決方法

本文始發於個人公眾號:**TechFlow**,原創不易,求個關注 今天是Python專題的第25篇文章,我們一起來聊聊多執行緒開發當中死鎖的問題。 死鎖 死鎖的原理非常簡單,用一句話就可以描述完。就是當多執行緒訪問多個鎖的時候,不同的鎖被不同的執行緒持有,它們都在等待其他執行緒釋放出鎖來,於是便