在我無休止的追求,以瞭解std::contion_variable
的I碰到的下面。在this page它說以下內容:爲什麼既是性病的通知,並等待功能:: condition_variable需要一個鎖定的互斥
void print_id (int id) {
std::unique_lock<std::mutex> lck(mtx);
while (!ready) cv.wait(lck);
// ...
std::cout << "thread " << id << '\n';
}
它說,這之後:
void go() {
std::unique_lock<std::mutex> lck(mtx);
ready = true;
cv.notify_all();
}
現在據我瞭解,這兩種功能將暫停在std::unqique_lock
線。直到獲得獨特的鎖定。也就是說,沒有其他線程有鎖。
所以說print_id
功能首先執行。這個獨特的鎖將會被使用,並且這個功能會在等待線上停下來。
如果隨後執行go
功能(在單獨的線程),代碼有將停止在唯一的鎖線。由於該互斥鎖已被print_id
函數鎖定。
顯然,如果代碼是一樣,這是行不通的。但我真的沒有看到我不在這裏。所以請賜教。
我不認爲print_id應該使用相同的鎖。鎖在那裏,所以只有一個線程可以運行print_id,並且只有一個線程運行go()。 –
嗯我檢查http://en.cppreference.com/w/cpp/thread/condition_variable和生產者和消費者都使用相同的鎖。奇。 –
@Angew你的意思是「保護條件變量本身」?條件變量不是固有的線程安全嗎? – laurisvr