【发布时间】:2017-04-13 02:38:48
【问题描述】:
我有一个非常简单的 C++ 生产者消费者线程代码,除了打印“Hello World”
我想要打印以下代码是这样的:
“HelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorldHelloWorld”
condition_variable mcond; // the variable communicating events
mutex mmutex; // the locking mechanism
void hello()
{
while (true) {
unique_lock<mutex> lck{ mmutex }; // acquire mmutex
mcond.wait(lck); /* do nothing */; // release lck and wait;
// re-acquire lck upon wakeup
cout << "Hello";
lck.unlock();
}
}
void world()
{
while (true)
{
unique_lock<mutex> lck{ mmutex }; // protect operations
cout << "World";
mcond.notify_one();
}
}
int main()
{
thread t1{ hello };
thread t2{ world };
t1.join();
t2.join();
return 0;
}
上面的代码打印的是这样的:
“世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界世界
我怀疑它没有同步打印的原因是因为 world() 函数正在释放锁并在 hello() 有机会抓住它之前立即再次抓住它。
我不知道如何解决这个问题。如何正确设置线程同步?
【问题讨论】:
标签: c++ multithreading concurrency