簡體   English   中英

如何將多個線程同步到一個?

[英]How to synchronize multiple threads to one?

我有一個多線程應用程序,我想允許其中一個線程以外的所有線程同步運行。 但是,當特定線程喚醒時,我需要其余線程進行阻塞。

我當前的實現是:

void ManyBackgroundThreadsDoingWork()
{
    AquireMutex(mutex);

    DoTheBackgroundWork();

    ReleaseTheMutex(mutex);
}


void MainThread()
{
    AquireMutex(mutex);

    DoTheMainThreadWork();

    ReleaseTheMutex(mutex);
}

之所以起作用,是因為它確實使后台線程在主線程執行其工作時不會在關鍵塊內運行。 但是,即使后台線程不一定需要互斥鎖,也有很多爭用。 主線程間歇地運行,而后台線程能夠彼此並發運行,而不是與主線程並發運行。

我有效完成的工作是使用鎖將多線程體系結構簡化為單線程體系結構……這很愚蠢。 我真正想要的是一種大多數情況下都是多線程的體系結構,但是等待一小步操作完成后又回到多線程。

編輯:問題的解釋。

我所擁有的應用程序可以顯示來自pcie采集卡的多個視頻源。 pcie采集卡驅動程序在其管理的線程上發出回調,這些回調實際上是ManyBackgroundThreadsDoingWork函數。 在此功能中,我將捕獲的視頻幀復制到緩沖區以進行渲染。 主線程是間歇運行的渲染線程。 復制線程需要在渲染期間阻塞,以防止視頻撕裂。

我最初的方法是簡單地進行雙緩沖,但這並不是真正的選擇,因為捕獲卡驅動程序不允許我緩沖幀而不將幀推入系統內存。 AMD使用的技術稱為“ DirectGMA”,它允許采集卡將視頻幀直接推入GPU內存。 同步的唯一方法是在實際渲染周圍放置glFence和互斥鎖,因為捕獲卡將不斷將數據流傳輸到GPU內存。 驅動程序不提供幀傳輸完成時間的指示。 回調提供了足夠的信息,讓我知道在准備觸發傳輸時已准備好傳輸幀。 但是,我需要在場景渲染期間阻止傳輸,以防止視頻中的撕裂和偽影。 上述技術是pcie卡制造商建議的技術。 但是,當您一次要播放多個視頻時,該技術就會失效。 因此,這個問題。

您需要同時支持共享鎖定模式和獨占鎖定模式的鎖,有時也稱為讀取器/寫入器鎖 這允許多個線程獲得讀取(共享)鎖,直到一個線程請求排他(寫入)鎖。

暫無
暫無

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

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