似乎是thread1
功能並沒有得到執行C++線程不執行
#include <iostream>
#include <fstream>
#include <thread>
#include <condition_variable>
#include <queue>
std::condition_variable cv;
std::mutex mu;
std::queue<int> queue;
bool ready;
static void thread1() {
while(!ready) {std::this_thread::sleep_for(std::chrono::milliseconds(10));}
while(ready && queue.size() <= 4) {
std::unique_lock<std::mutex> lk(mu);
cv.wait(lk, [&]{return !queue.empty();});
queue.push(2);
}
}
int main() {
ready = false;
std::thread t(thread1);
while(queue.size() <= 4) {
{
std::lock_guard<std::mutex> lk(mu);
queue.push(1);
}
ready = true;
cv.notify_one();
}
t.join();
for(int i = 0; i <= queue.size(); i++) {
int a = queue.front();
std::cout << a << std::endl;
queue.pop();
}
return 0;
}
我的Mac上的輸出是1 2 1 2
但在我的Ubuntu其1 1 1
。我正在編譯g++ -std=c++11 -pthread -o thread.out thread.cpp && ./thread.out
。我錯過了什麼嗎?
不能保證在主循環再次鎖定之前,thread1將能夠獲取互斥鎖。這就是多線程的方式,它可能是不可預測的。 –
但我認爲thread1中的條件變量會用等待鎖定互斥鎖,並同時將main和thread1同步。我能做些什麼來同步順序運行? – Seph
你有一個競爭條件。 ''thread''可以在'main'執行'queue.push(1)'時執行'queue.size()',並且行爲是不確定的。 – GManNickG