我正在尝试从字符串线程中读取单词。意味着一个线程读取一个单词,当所有单词完成后,所有线程也应该平稳地退出。在此示例中,字符串中有11个单词,并且该字符串上有4个线程。但该计划在运行时被绞死。我无法确定问题所在。我也尝试了递归,但是没有用,被绞死了。
#include <iostream>
#include <mutex>
#include <sstream>
#include <thread>
#include <chrono>
#include <condition_variable>
using namespace std;
stringstream s("Japan US Canada UK France Germany China Russia Korea India Nepal");
int count = 0;
string word;
condition_variable cv;
mutex m;
int i = 0;
bool check_func(int i,int k)
{
return i == k;
}
void print(int k)
{
while(count < 11) // As there are 11 words
{
unique_lock<mutex> lk(m);
int z = k;
cv.wait(lk,[&]{return check_func(i,z);}); // Line 33
s >> word;
cout<<word<<" ";
i++;
cv.notify_all();
count++;
}
return;
}
int main()
{
thread threads[4];
for(int i = 0; i < 4; i++)
threads[i] = thread(print,i);
for(auto &t : threads)
t.join();
return 0;
}
答案 0 :(得分:4)
您从未通知过条件变量。它永远不会醒来。所有线程都在等待发生的事情。在print
函数结束时通知:
void print(int k)
{
unique_lock<mutex> lk(m);
int z = k;
cv.wait(lk,[&]{return check_func(i,z);}); // Line 33
cout<<"Thread no. "<<this_thread::get_id()<<" parameter "<<k<<"\n";
i++;
cv.notify_all(); // Wake up all waiting threads - the correct one will continue.
}
您还需要将全局变量i
初始化为零,否则您将有未定义的行为。