【问题标题】:Boost Interthread Communication促进线程间通信
【发布时间】:2015-01-05 11:16:56
【问题描述】:

我必须实现提升线程间通信。考虑以下代码:

#include <boost/thread/thread.hpp>
#include <Windows.h>
void threadA()
{
    while(true)
    {
        std::cout << "From thread A" << std::endl;
        Sleep(3000); //pretend to do the work
    }
}

void threadB()
{
    while(true)
    {
        std::cout << "From thread B" << std::endl;
        Sleep(3000); //pretend to do the work
    }
}

int main()
{
    boost::thread *th1 = new boost::thread(&threadA);
    boost::thread *th2 = new boost::thread(&threadB);
    th1->join();
    th2->join();
    delete th1;
    delete th2;
}

如果我运行上面的代码,它将产生两个线程。我想要做的是启动threadA 并向threadB 发送一些消息,收到后将启动线程。或者更一般地说,如果这两个线程独立运行,我该如何处理通信?

【问题讨论】:

    标签: c++ multithreading boost


    【解决方案1】:

    有很多方法。

    • 使用条件变量(又名事件)
    • 使用并发队列(例如消息)或更通用的信号量
    • 使用无锁并发数据结构

    Boost 提供上述所有功能的实现。

    【讨论】:

    • 一种方法是实现一个全局变量并在线程中检查它们。如何在现有代码中使用信号量、无锁队列?
    • 以任何方式在其他语言/平台中使用它们。它们实际上是与语言无关的概念。只需阅读一些文档(boost.org/doc/libs/1_57_0/doc/html/lockfree.htmlboost.org/doc/libs/1_57_0/doc/html/thread/…)。而且,将无锁队列与信号量相结合是零意义的。
    • '实现一个全局变量并在线程中检查它们' - 用于大多数用途的 terribru。这种通信很少见,例如。一个原子 'AppClosing=true' 让所有线程偶尔检查一下,但对于轮询浪费 CPU、内存带宽和能量的一般线程间通信来说非常没有希望(除非你的办公室真的很冷)。
    猜你喜欢
    • 1970-01-01
    • 2011-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    相关资源
    最近更新 更多