多类中的多线程
Multi-Threads inside Multi-Classes
我想运行两个线程,每个线程对应一个。但我希望他们是独立的。例如,我有这样的东西:
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()
有一个论点,但你仍然需要在某个地方调用该析构函数,所以我们仍然没有得到我认为你正在寻找的相同的自动化。
这个例子非常简单,但它希望能显示一些重要的东西。无论你在类中的哪个位置实现这个功能来加入线程,它要么会阻止你使用你的主线程做其他事情,比如创建第二个线程(从而破坏线程的大部分目的),要么你将不得不调用这个成员函数,无论如何都要从你的主线程手动加入线程, 唯一的区别是它将是类的成员函数,而不是您在上面示例中所拥有的。
TLDR 由于join()
是一个阻塞函数,因此必须"手动"调用它,以确保您可以从线程中获得任何好处。
- 在C++中使用cURL和多线程
- 多线程双缓冲区
- 为什么我的多线程作业队列崩溃
- 在main()之外初始化std::vector会导致性能下降(多线程)
- 试图创建一个多线程程序来查找0-100000000之间的总素数
- 为什么一个向量上的多线程操作很慢
- 学习多线程C++:添加线程不会使执行速度更快,即使它看起来应该
- 全局变量 多读取器 一个写入器多线程安全?
- boost::文件系统::recursive_directory_iterator多线程安全
- 如何阻止TensorFlow的多线程
- 如何在多线程中正确使用unique_ptr进行多态性?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- sigwait() 在多线程程序中不起作用
- 多线程程序中出现意外的内存泄漏
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 多线程比没有线程C++慢
- 具有 C++11 多线程的特征库
- 通过安装信号处理程序关闭多线程应用程序
- 成员变量在多线程 C++ 时自行更改
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误