在C++中并行运行线程

Run threads in parallel in C++

本文关键字:运行 线程 并行 C++      更新时间:2023-10-16

我正在尝试为家庭作业做一个dekker算法实现,我理解这个概念,但我无法使用C++0x并行执行两个线程。

#include <thread>
#include <iostream>
using namespace std;
class Homework2 {
public:
void run() {
try {
thread c1(&Homework2::output_one, this);
thread c2(&Homework2::output_two, this);

} catch(int e) {
cout << e << endl;
}
}
void output_one() {
//cout << "output one" << endl;
}
void output_two() {
//cout << "output two" << endl;
}

};
int main() {
try {
Homework2 p2;
p2.run();
} catch(int e) {
cout << e << endl;
}
return 0;
}

我的问题是线程会返回这个错误:

terminate called without an active exception
Aborted

到目前为止,对我来说,成功的唯一途径是添加c1.join();c2.join();或.destrict();问题是join();将等待线程完成,并分离()。。。嗯,我不确定分离会做什么,因为没有错误,也没有输出,我想它会让线程自己处理。。。

所以所有这些都可以说:有人知道我如何做到这两个线程并行运行而不是按顺序运行吗??我们必须感谢您的帮助!

谢谢。-

第页。S:以下是我为构建所做的:

g++ -o output/Practica2.out main.cpp -pthread -std=c++11 

到目前为止,对我来说,唯一成功的方法就是添加c1.join();c2.join();或.destrict()

在派生出这两个线程后,主线程将继续,并且根据您的代码,很快结束(p2.run()return 0;在CPU指令"时间"上相对接近)。根据线程启动的速度,在程序终止之前,它们可能没有足够的CPU时间来完全"生成",或者如果它们完全生成,则可能没有足够时间由内核进行正确的清理。这也被称为种族状况。

从派生线程中调用派生线程的join可以让线程在程序退出之前(在后台)正确地完成和清理(这是一件好事)。调用detach在这种情况下也很有效,因为它从线程对象中释放了所有资源(在后台),但保持线程处于活动状态。在调用detach的情况下,由于线程对象与执行线程分离,因此没有报告错误,因此当程序退出时,内核(很好地)为您清理了线程(或者至少这是可能发生的情况,取决于操作系统/编译器实现等),因此您不会看到线程以"不干净"结尾。

所以所有这些都在说:有人知道我如何做到这两个线程并行运行而不是按顺序运行吗

我想您可能对线程的工作方式有些困惑。你的线程已经"并行"运行了(可以这么说),这就是线程的本质。您发布的代码没有任何本质上"并行"的东西(即数据的并行计算),但您的线程是并发运行的(同时运行,或与每个线程"并行")。

如果您希望主线程在不将join放入run函数的情况下继续运行,那么这将需要比您当前拥有的代码多一点的代码,我不想假设您的代码的未来会是什么样子,但您可以看看这两个关于std::thread作为类的成员(以及在类中执行)的问题。

我希望这能有所帮助。

好的,这有点复杂,但我会尝试在代码中解释一些事情。

当您在名为run的方法中创建线程时,您想要打印两件事(假设您取消注释行),但线程对象在创建它们的方法(run)的堆栈取消编码中被破坏。

实际上,您需要做两件事,首先创建线程并保持它们运行(例如,作为指针执行),然后调用方法join以在它们完成时释放所有内存和所需的东西。

您可以将线程存储在类似std::vector<std::thread*>的向量中