簡體   English   中英

在線程池和進程之間增強Mutex

[英]Boost Mutex between threadpool and process

我在Test類中有4個函數:

void Test::A()
{
    boost::lock_guard<boost::mutex> lock(mutex);
    cout << "A!" << endl;
}

void Test::B()
{
    boost::lock_guard<boost::mutex> lock(mutex);
    cout << "B!" << endl;
}

void Test::C()
{
    boost::lock_guard<boost::mutex> lock(mutex);
    cout << "C!" << endl;
}

void Test::D()
{
    boost::lock_guard<boost::mutex> lock(mutex);
    cout << "D!" << endl;
}

如果我按字母順序調用Test::ATest::D ,並在循環中反復遍歷並將它們綁定到boost thread_pool,則在大多數情況下都可以正常工作。 但是,有時cout語句會按順序打印。 所以我可能會看到ABCDABCDABCDAB DC 據我了解,它只是與thread_pool獲得新線程有關,我無法控制按什么順序調用它們。

我的問題是我需要順序調用C()和D()(需要調用它們時),而不關心A()和B()相對於彼此以及C()和d()。 因此,我現在不再通過thread_pool調用C和D,而是通過主進程調用它,並保留所有互斥鎖。 當我嘗試再次在循環中調用所有函數時,程序掛在C中的cout語句之前。 我為此感到困惑。 我能否在主進程及其線程中沒有互斥體?

盡管這些功能的性質很簡單,但我無法僅將C和D的邏輯結合起來,因為這些功能最終將升級為基於事件的功能。 一遍又一遍地調用它們的循環只是一個模擬現實生活事件的虛擬循環。 D將始終在C之后被調用,但是它可能會或可能不會被調用。

例如:

A B C D

ABCCD

廣告

ABCCC

如果C和D可以由單獨的事件觸發(即,您不能只是在同一線程中依次調用它們),但是D不能在C之前執行,則需要使用條件變量或其他同步方式(也許是信號燈)。

由於您已經在使用Boost,因此建議您查看Boost條件變量

這是完全正常的。 當您啟動兩個線程池線程(首先是A,然后是B)時,就無法保證A會先於B到達cout語句。 這只是可能 您創建的錯誤稱為“線程競賽”,這是使用線程的代碼中非常常見的錯誤,眾所周知,它很難診斷和修復。

這些線程以自己的速度運行。 如果操作系統搶占了A而不搶占了B,例如,當它想允許另一個進程中的另一個線程運行時,那么B一定會搶先於A並首先進入cout語句。 確保嚴格按順序執行這些cout語句的唯一簡單方法是使用一個線程。

如果要保持執行順序,請查看信號量。 鎖是FIFO,因此無論哪個線程先獲得鎖,都將首先執行。 為了確保在D之前調用C,請執行以下操作:

C : increment semaphore by 1
D : decrement semaphore by 1

如果信號量從0開始,則只有在信號量為1時D才能減少信號量(已經由C遞增)。 在這種情況下,您可以使用二進制信號量。 可能的值為0或1。

您可能有一個fifo隊列來排序C / D事件並處理並刪除該隊列中的第一個元素(如果有結果的話)(也許是線程E)。 如果線程C和D可能互相干擾,請僅制作一個線程CD。

如果C事件實際上觸發了D事件,則可以考慮使用並行管道C-> D。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM