我正在尝试为家庭作业做一个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();将等待线程完成,并分离(); ...好吧我不知道什么是分离,因为没有错误但也没有输出,我想这会留下线程自己......
所以这一切都说: 有谁知道我怎么能这样做两个线程并行而不是顺序? 必须得到帮助!
感谢.-
P.S: 这是我为构建做的事情:
g++ -o output/Practica2.out main.cpp -pthread -std=c++11
答案 0 :(得分:2)
到目前为止,成功的唯一途径是添加c1.join(); c2.join();或.detach(); ...
在您生成2个线程之后,您的主线程将继续,并且根据您的代码,结束'非常'快速(p2.run()
然后return 0;
在CPU指令'时间'中相对接近) 。根据线程的启动速度,它们可能没有足够的CPU时间在程序终止之前完全“生成”,或者如果它们完全生成,可能没有足够的时间来进行内核的正确清理。这也称为race condition。
从生成它们的线程中调用生成的线程上的join
允许线程在程序退出之前完成并正确清理(在引擎盖下)(一件好事)。调用detach
也适用于这种情况,因为它从您的线程对象释放所有资源(在引擎盖下),但保持线程处于活动状态。在调用detach
的情况下,没有报告错误,因为线程对象与执行线程分离,所以当你的程序退出时,内核(很好地)为你清理了线程(或者至少是那个< i>可能发生,取决于操作系统/编译器实现等。)所以你没有看到你的线程以'uncleanly'结尾。
所有这一切都说:有人知道我怎么能这样做两个线程并行而不是顺序?
我认为你可能对线程如何工作有些困惑。你的线程已经“并行”运行(可以这么说),这就是线程的本质。你发布的代码没有任何本质上是“并行”的东西(即数据的并行计算),但是你的线程同时运行(同时或者“并行”)。
如果你希望你的主线程继续而不将join
放在run
函数中,这将需要比你现在拥有的代码更多的代码,我不想假设你的代码的未来应该看起来,但您可以查看有关std::thread
作为类成员的these two个问题(并在其中执行)。
我希望可以提供帮助。
答案 1 :(得分:1)
好的,这有点复杂,但我会尝试解释代码中的一些内容。
当你在名为run的方法中创建线程时,你想要打印两个东西(想象你取消注释这些行),但是线程对象在堆栈中被销毁,而不是创建它们的方法(运行)。
你实际上需要做两件事,首先创建线程并保持它们运行(例如将它作为指针),然后再调用方法join来释放它们完成时所需的所有内存和内容。
您可以将线程存储在类似std::vector<std::thread*>