使用 std::thread 在 C++ 中的单独线程中执行每个对象

Posted

技术标签:

【中文标题】使用 std::thread 在 C++ 中的单独线程中执行每个对象【英文标题】:Executing each Object in a seperate thread in C++ using std::thread 【发布时间】:2018-11-15 13:07:17 【问题描述】:

考虑如下所示的两个类

class CommandChannel

private:
    std::thread cChannelThread;
public:
    CommandChannel();
    ~CommandChannel();

    void start_comm_channel(int port, std::string ip);

    int myfunction(int a, int b);
    double otherfunction(std::string test);

    void stop_comm_channel();
;


class EventChannel

private:
    std::thread evChannelThread;
public:
    EventChannel();
    ~EventChannel();

    void start_ev_chnl(int port, std::string ip);

    int evFunction(int a, int b);
    double anotherfunction(std::string othertest);

    void stop_ev_chnl();
;

我想以这样一种方式向用户公开公共函数:每当用户从 CommandChannel 类调用函数时,它们就会在一个线程中运行,比如 cChannelThread。每当用户从EventChannel 类中调用一个函数时,它们就会在另一个线程evChannelThread 中运行。 我不确定这是否是一个好主意,但我是 C++ 新手,尤其是多线程新手。基本思想是将EventChannel 类完全保留在CommandChannel 类之外的另一个线程中。 P.S 这个问题是我之前提出的一个问题的改写版本,该问题被搁置了。我希望这一次更清楚。

【问题讨论】:

这对于这个网站来说可能太宽泛了。我认为您可能需要某种排队机制来将函数调用请求提供给每个类的正在运行的线程。还有一些方法可以同步每次调用的结果? (std::promise/std::future)? 顺便说一句,您可以拥有多个同一类的对象。那么调用同一类的两个不同对象呢?只在一个线程中为整个类运行它们还是在每个类的 object 一个线程中运行它们? @Galik,是的,每个对象都应该有一个单独的类。当然,可以创建多少对象是有限制的。但我想了解如何实现这种多线程。 【参考方案1】:

我想以这样一种方式向用户公开公共函数,即每当用户从 CommandChannel 类调用函数时,它们都会在一个线程中运行,比如 cChannelThread

在这种情况下,您需要将调用转发到另一个线程。这可以通过将带有所有调用参数的副本的函数指针/lambda 保存到 std::function<void()> 对象中,将该对象传递给另一个线程并调用该对象来完成。

如果你的函数返回其他东西然后void 那么你需要一种机制来将返回值传递回调用线程。有不止一种方法可以做到这一点,您可以从使用std::packaged_task开始。

要在线程之间传递对象,请使用原子队列,例如Intel Concurrent Queue Classes。

在线程之间共享对象时要小心。如果一个对象在线程之间共享,并且至少有一个线程修改了该对象,则需要锁定以防止竞争条件。

【讨论】:

以上是关于使用 std::thread 在 C++ 中的单独线程中执行每个对象的主要内容,如果未能解决你的问题,请参考以下文章

C++ 中的 std::thread 库是不是支持嵌套线程?

std::thread,在线程中抛出异常会导致 Visual C++ 中的中止错误

C++ 多线程std::thread 详解

C++ 多线程std::thread 详解

C++ std::thread概念介绍

C++ 11 std::thread 循环