Multi-类 中的多线程
Multi-Threads inside Multi-Classes
我想要 运行 两个线程,每个线程一个 class 我有。但我希望他们独立。例如,我有这样的东西:
class A
{
pthread_t threadA;
void runThreadA() { pthread_create(... arguments_here ...)};
}
class B
{
pthread_t threadB;
void runThreadB() { pthread_create(... arguments_here ...)};
}
目前我在内部为每个 class 创建和 运行 这两个线程,但我的主线程是这样的:
main()
{
A.runThreadA();
B.runThreadB();
pthread_join(threadA, NULL);
pthread_join(threadB, NULL);
return 0;
}
如何在内部也加入两个线程,导致两个线程两个 运行 并行?
希望我能理解..
谢谢
我将保留此作为答案,因为我还没有发表评论的特权,但我会尽力而为。我要解释的是,当您说在内部加入线程时,您的意思是在 class 内部自动执行,而不必在 main 函数中编写额外的加入行。简而言之,答案是肯定的。您可以从 class 内部调用 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()
。所以,如果我们尝试这种方法,很明显线程不是 运行 并行的,一开始就使用线程也没有任何好处。
有一个关于在 class 的析构函数中调用 join()
的参数,但您仍然需要在某处调用该析构函数,所以我们仍然没有获得我认为的相同自动化你在找
这个例子非常简单,但它希望能说明一些重要的事情。无论您在 class 中的哪个位置实现此功能以加入线程,它都会阻止您使用主线程执行其他操作,例如创建第二个线程(从而破坏线程的大部分目的),或者你将不得不调用这个成员函数,无论如何从你的 main 手动加入线程,唯一的区别是它将是 class 的成员函数,而不是上面例子中的成员函数。
TLDR 由于 join()
是一个阻塞函数,因此必须调用 "manually" 以确保您可以获得任何受益于跟帖。
我想要 运行 两个线程,每个线程一个 class 我有。但我希望他们独立。例如,我有这样的东西:
class A
{
pthread_t threadA;
void runThreadA() { pthread_create(... arguments_here ...)};
}
class B
{
pthread_t threadB;
void runThreadB() { pthread_create(... arguments_here ...)};
}
目前我在内部为每个 class 创建和 运行 这两个线程,但我的主线程是这样的:
main()
{
A.runThreadA();
B.runThreadB();
pthread_join(threadA, NULL);
pthread_join(threadB, NULL);
return 0;
}
如何在内部也加入两个线程,导致两个线程两个 运行 并行?
希望我能理解.. 谢谢
我将保留此作为答案,因为我还没有发表评论的特权,但我会尽力而为。我要解释的是,当您说在内部加入线程时,您的意思是在 class 内部自动执行,而不必在 main 函数中编写额外的加入行。简而言之,答案是肯定的。您可以从 class 内部调用 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()
。所以,如果我们尝试这种方法,很明显线程不是 运行 并行的,一开始就使用线程也没有任何好处。
有一个关于在 class 的析构函数中调用 join()
的参数,但您仍然需要在某处调用该析构函数,所以我们仍然没有获得我认为的相同自动化你在找
这个例子非常简单,但它希望能说明一些重要的事情。无论您在 class 中的哪个位置实现此功能以加入线程,它都会阻止您使用主线程执行其他操作,例如创建第二个线程(从而破坏线程的大部分目的),或者你将不得不调用这个成员函数,无论如何从你的 main 手动加入线程,唯一的区别是它将是 class 的成员函数,而不是上面例子中的成员函数。
TLDR 由于 join()
是一个阻塞函数,因此必须调用 "manually" 以确保您可以获得任何受益于跟帖。