【问题标题】:Pass a queue between threads in c++在 C++ 中的线程之间传递队列
【发布时间】:2014-11-26 23:22:45
【问题描述】:

我正在寻找一种在 C++ 中的线程之间传递队列的方法,下面是我想要做的一个非常基本的大纲。它作为一个函数工作,但我需要使用单独的线程,因为任务和主线程都有单独的循环来执行。

函数如下:

void task1(queue <bool> &qPass)
{
    bool bits[5] = { 1, 0, 0, 1, 1 };

    for (int i = 0; i < 5; i++)
    {
        qPass.push(bits[i]);
    }

    cout << "Task:\tpush complete\t(" << qPass.size() << ")" << endl;
}

主要

int main()
{
    queue <bool> qPass;
    int n;

    //thread task(task1, qPass);//thread call doesnt work
    //task.join();

    task1(qPass);//function call works

    n = qPass.size();
    cout << "Main:\t";
    for (int i = 0; i < n; i++)
    {
        cout << qPass.front();
        qPass.pop();
    }
    cout << "\t(" << n << ")" << endl;

    cin.get();
    return 0;
}

如果我注释函数调用并取消注释线程调用,它将运行但 main 中的队列未填充。提前致谢。

【问题讨论】:

  • 嗯,很有趣。不要传递对线程过程的引用,而是传递一个指针(或使用捕获 lambda)。另外,只是好奇,如果您等待线程同步加入,使用线程会给您带来什么好处?或者这只是示例代码?
  • 它甚至可以编译吗?!? (哦,你在使用 Microsoft 编译器吗?)
  • 只是示例代码实际任务中的循环将运行直到终止并每100ms左右传递数据(如果有任何东西要传递),主循环要快得多~1ms并且需要执行任务在这个时间尺度上。我正在使用 Visual Studio 耶

标签: c++ multithreading queue


【解决方案1】:

您需要将参数包装在引用包装器中:

std::thread task(task1, std::ref(qPass));
//                      ^^^^^^^^

(否则,线程对象会绑定队列的本地私有副本,并且您的主队列永远不会被触及。)

【讨论】:

  • 接受的答案here 描述了这一点
猜你喜欢
  • 2011-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-17
  • 2017-07-01
  • 2017-11-22
  • 1970-01-01
相关资源
最近更新 更多