簡體   English   中英

如何使用C ++ 11線程功能同步2個函數?

[英]How to synchronize 2 functions using C++11 thread features?

我們有兩個函數:a()和b()。

有多個線程。 他們中的一些人想要執行a(),其他人想要執行b()。 有以下限制:

  • 不允許2個線程同時執行a()
  • 當某個線程正在執行a()時,不允許任何線程執行b()
  • 允許多個線程同時執行b()

如何使用C ++ 11功能進行編碼?

評論中指出的 ,這是C ++ 14的std::shared_timed_mutex指定的讀寫器鎖的典型用例。

因此,如果您的標准庫實現已經支持它,只需使用以下一種方法:

std::shared_timed_mutex mtx;

void a() {
    std::unique_lock<std::shared_timed_mutex> lk(mtx);
    // ...
}

void b() {
    std::shared_lock<std::shared_timed_mutex> lk(mtx);
    // ...
}

Boost.Thread的最新版本提供了與編譯器無關的實現。

如果您不能使用其中任何一個,則仍然可以嘗試滾動自己的實現(盡管這樣做的通常的缺點是,如果不小心,可能會引入細微的錯誤)。

基本思想是擁有一個受普通互斥鎖保護的計數器。 每當獲取共享鎖時,計數器就會增加,而在釋放共享鎖時,計數器會減少。 獲取排他鎖會將計數器設置為特殊值,否則該值將無法達到。

僅當計數器為0時才允許獲取排他鎖(即,當前沒有激活的共享鎖)。 僅當計數器的值不是特殊值時(即,當前未持有排他鎖),才允許獲取共享鎖。 如果嘗試獲取鎖而未滿足相應的前提條件,則可以旋轉或(可能更可取)等待條件變量,直到滿足前提條件。 請注意,在這種情況下,您將需要兩個條件變量,每個前提條件一個。

如果我理解正確,則將需要一個全局鎖來保護函數a,該全局鎖必須同時鎖定在a()和b()內。 它看起來像這樣:

#include <mutex>
#include <thread>

std::mutex a_lock;

void a() 
{
    std::lock_guard<std::mutex> lock(a_lock);
}

void b()
{
    std::lock_guard<std::mutex> lock(a_lock);

}

請注意,使用lock_guard時,函數返回時將自動釋放該鎖。

e:是的,我誤解了你的問題。 稍等一會。

暫無
暫無

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

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