多类中的多线程

时间:2016-07-11 13:34:44

标签: 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;
}

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

希望我能理解...... 谢谢

1 个答案:

答案 0 :(得分:1)

我将留下这个作为答案,因为我还没有特权评论,但我会尽力给予它。我将解释当你在内部连接线程时,你的意思是在类中并自动,而不必在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()是阻塞函数。因此,如果我们调用Class1::CreateThread()中的main(),它将会阻塞,直到线程完成并加入,然后才能调用Class2::CreateThread()。因此,如果我们尝试这种方法,很明显线程并不是并行运行,也不是首先使用线程有任何好处。

在类的析构函数中调用join()有一个参数,但你仍然需要在某个地方调用析构函数,所以我们仍然没有得到我认为你正在寻找的那个自动化。

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

TLDR 由于join()是阻止函数,因此必须“手动”调用它,以确保您可以从线程中获得任何好处。< / p>