【问题标题】:Reading m words from a paragraph from n thread ? C++ multithreading ? Not working?从 n 个线程的段落中读取 m 个单词? C++ 多线程?不工作?
【发布时间】:2016-05-04 08:34:00
【问题描述】:

我想通过使用 Multithreading 一次提取一个单词来阅读一个段落。每个线程应该读一个字,当段落结束时,他们应该和平退出。我知道不应该以这种方式使用线程,因为那样没有优势。但我想这样做,以便在需要时检查线程如何按顺序工作。我试过了,但看起来程序正在进入死锁状态并且根本没有给出任何输出。字符串中有 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;
}

【问题讨论】:

    标签: multithreading c++11 mutex deadlock


    【解决方案1】:

    您需要更改此代码:

    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++;
    }
    

    到这里:

    int z = k;
    while(z < 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++;
        z+=4;
        cv.notify_all();
        count++;
    }
    

    上面有三处改变:z 的声明移到循环外,while 中的条件更改为检查z 而不是count,并添加了z+=4 行。如果您希望每个线程移动到下一个单词,则每次需要将 z 增加 4。此外,您需要检查 z 不计数,因为否则某些线程会超调并且最后一个单词将被打印多次(考虑读取第九个单词的线程:如果检查计数而不是 z 它将继续进行下一次迭代循环,即使它没有什么可以读取的了)。

    【讨论】:

    • 好吧,可能是我没有以正确的方式解释代码。但是实施您的建议,即注释通知和等待将导致第一个线程读取所有单词,而其余三个线程将一遍又一遍地读取最后一个单词,打印字符串 + 尼泊尔 4 次,这应该只有一次。目标是每个线程应该以循环方式一次读取一个单词,并且一旦字符串被完全读取就和平退出。第二件事,全局变量 i 正在发生变化。只看 s >> 字之后;你会看到 i++ ;我猜你想念那个。无论如何谢谢!
    • 是的,你是对的,我确实错过了。但请考虑一下:您的cv.wait(...) 等待一个条件,该条件只能在每个线程的while 循环的一次迭代中为真(因为 z 永远不会改变,但 i 会改变)。因此,您的任何线程都不可能多次完成循环。无论如何,我会编辑我的答案。
    • 那么 z+= 4 也不起作用,程序被挂起,因为每个线程肯定每个线程都会用它的参数 vale 初始化 z 但每个线程也会用 4 递增它,这使得谓词在循环的第二次执行中变为下降。适当的修正是 if( i == 4 ) i = 0;这将使所需的结果成为可能,是的,如果(s >> 单词)再添加一个 s >> 单词希望您知道原因。是的,所有条件变量等待函数和通知都是必须的,否则程序将无法以任何方式运行。
    • 您是否也进行了其他更改(不仅仅是添加 z+=4)?我试过这段代码,它可以按你的意愿工作。
    • 老板我复制了你的整个代码,但它无法正常工作,直到程序挂起。原因和我上面提到的一样。
    猜你喜欢
    • 2017-10-18
    • 2015-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多