c++ - 多类中的多线程

标签 c++ multithreading class pthreads posix

我想运行两个线程,每个线程对应一个类。但我希望他们独立。例如,我有这样的东西:

class A
{
    pthread_t threadA;

    void runThreadA() { pthread_create(... arguments_here ...)};
}

class B
{
    pthread_t threadB;

    void runThreadB() { pthread_create(... arguments_here ...)};
}

目前我为每个类在内部创建并运行两个线程,但我的主要是这样的:

main()
{
    A.runThreadA();
    B.runThreadB();

    pthread_join(threadA, NULL);
    pthread_join(threadB, NULL);

    return 0;
}

如何在内部也加入两个线程,使两个线程并行运行?

希望我能理解.. 谢谢

最佳答案

我将把这个留作答案,因为我还没有发表评论的特权,但我会尽力而为。我要解释的是,当你说在内部加入线程时,你的意思是在类内部自动加入,而不必在 main 函数中编写额外的加入行。简而言之,答案是肯定的。您可以从类内部调用 join,但这样做有些无效,原因如下。

让我们考虑这个例子(我将使用 std::thread 因为我更习惯它,但 pthread 的工作方式非常相同):

class1
{
    std::thread *t1;
    void DoWork1();
    void CreateThread1() { 
        t1= new std::thread(&class1::DoWork1, this)
        JoinThread1();
    }
    void JoinThread1(){
        if (t1.joinable()) {
            t1.join();
        }
    }

};

class2
{
    std::thread *t2;
    void DoWork2();
    void CreateThread2() { 
        t2= new std::thread(&class2::DoWork2, this)
        JoinThread2();
    }
    void JoinThread2(){
        if (t2.joinable()) {
            t2.join();
        }
    }
};

现在我们理论上已经完成了这个目标,每次我们调用 Class1::CreateThread() 它都会自动加入,而不需要额外的 join()在主线程中调用。除了我们必须记住 join() 是一个阻塞函数。因此,如果我们在 main() 中调用 Class1::CreateThread() 那么它将阻塞直到线程完成并加入,然后才能够调用 Class2::CreateThread()。因此,如果我们尝试这种方法,很明显线程不是并行运行的,而且一开始就使用线程也没有任何好处。

有一个关于在类的析构函数中调用 join() 的论点,但您仍然需要在某个地方调用该析构函数,所以我们仍然没有获得我认为您认为的相同的自动化正在寻找。

这个例子非常简单,但它希望能说明一些重要的事情。无论您在类中的哪个位置实现此功能以加入线程,它都会阻止您使用主线程做其他事情,例如创建第二个线程(从而破坏线程的大部分目的),或者您将拥有无论如何,要从您的 main 手动调用这个加入线程的成员函数,唯一的区别是它将是类的成员函数,而不是上面示例中的成员函数。

TLDR 因为 join() 是一个阻塞函数,所以必须“手动”调用它以确保您可以从中获得任何好处的线程。

关于c++ - 多类中的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38308366/

相关文章:

c++ - 使用自定义比较器排序时出现运行时错误

c# - OOP(object oriented programming on C++)在学习c#之前有必要学习吗?

c++ - 将字符串添加到未知大小的数组 C++

ruby - 为什么 Ruby 中的 MyClass.class.superclass 是 Module

PHP 特征方法冲突 : trait "inheritance" and trait hierarchies

c++ - “板”未在此范围内声明

C++数组作为函数参数

c# - 后台线程比 UI 线程花费更多时间

java - 排队多个下载,寻找生产者消费者 API

java - 检查和控制实际并行运行的应用程序线程数