我正在尝试为作业做一个 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();或.detach(); 问题是 join();将等待线程完成,然后 detach(); ...好吧,我不确定分离会做什么,因为没有错误,但也没有输出,我猜它会让线程自行...
所以所有这些都是要说的: 有谁知道我怎样才能让两个线程并行运行而不是顺序运行? 必须感谢您的帮助!
谢谢。-
附: 这是我为构建所做的事情:
g++ -o output/Practica2.out main.cpp -pthread -std=c++11
最佳答案
到目前为止,对我来说成功的唯一方法是添加 c1.join(); c2.join();或 .detach();...
生成 2 个线程后,主线程将继续运行,并且根据您的代码,“非常”快速地结束(p2.run()
然后 return 0;
code> 在 CPU 指令“时间”上相对接近)。根据线程启动的速度,它们可能没有足够的 CPU 时间在程序终止之前完全“生成”,或者如果它们确实完全生成,则内核可能没有足够的时间进行适当的清理。这也称为 race condition .
调用join
在您生成线程的生成线程上,允许线程在程序退出之前正确完成并清理(在引擎盖下)(一件好事)。调用detach
在这种情况下也适用,因为它从线程对象中释放所有资源(在后台),但保持线程处于事件状态。在调用 detach 的情况下,没有报告任何错误,因为线程对象已与正在执行的线程分离,因此当您的程序退出时,内核(很好地)为您清理了线程(或者至少这就是可能发生的情况,取决于操作系统/编译器的实现等),因此您不会看到线程“不干净”地结束。
所以这就是说:有谁知道我怎样才能让两个线程并行运行而不是顺序运行?
我认为您可能对线程的工作原理有些困惑。您的线程已经“并行”运行(可以这么说),这就是线程的本质。您发布的代码本质上没有任何“并行”的内容(即数据的并行计算),但您的线程正在并发运行(同时,或每个线程“并行”)。
如果您希望主线程继续运行而不将 join
放入 run
函数中,则需要比您当前拥有的代码多一点的代码,而我没有。不想假设你的代码的 future 应该是什么样子,但你可以看看 these two关于 std::thread 作为类成员(并在类中执行)的问题。
希望能有所帮助。
关于c++ - 在 C++ 中并行运行线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21744657/