似乎是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