C++ 在C+中并行运行线程+;

C++ 在C+中并行运行线程+;,c++,multithreading,parallel-processing,C++,Multithreading,Parallel Processing,我试图为家庭作业做一个dekker算法实现,我理解这个概念,但是我不能使用C++0x并行执行两个线程 #include <thread> #include <iostream> using namespace std; class Homework2 { public: void run() { try { thread c1(&Homework2::output_one, this);

我试图为家庭作业做一个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;
}
到目前为止,我成功的唯一途径是添加c1.join();c2.连接();或。分离(); 问题是join();将等待线程完成,然后分离()。。。我不确定detach是做什么的,因为没有错误,也没有输出,我想它会让线程自行处理

因此,所有这些都表明: 有人知道我如何做到这两个线程并行运行而不是顺序运行吗?? 我们必须感谢您的帮助

谢谢-

附言: 以下是我为构建所做的工作:

g++ -o output/Practica2.out main.cpp -pthread -std=c++11 
到目前为止,我成功的唯一途径是添加c1.join();c2.连接();或.detach()

生成这两个线程后,主线程将继续运行,并根据代码快速结束(
p2.run()
then
return 0;
在CPU指令“时间”上相对接近)。根据线程启动的速度,它们可能没有足够的CPU时间在程序终止之前完全“繁殖”,或者如果它们确实完全繁殖,那么内核可能没有足够的时间进行适当的清理。这也被称为a

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

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

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

如果希望主线程继续运行而不将
join
放在
run
函数中,则需要比当前拥有的代码多一点的代码,我不想假设代码的未来会是什么样子,但您可以查看有关
std::thread
作为类成员的问题(并在此范围内执行)

我希望这能有所帮助。

到目前为止,对我来说,成功的唯一途径是添加c1.join();c2.join();或.detach()

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

从生成线程中调用生成的线程允许线程在程序退出之前完成并正确清理(在引擎盖下)(一件好事)。调用在这种情况下也有效,因为它释放了所有资源(在引擎盖下)在调用
detach
的情况下,没有报告错误,因为线程对象已从正在执行的线程中分离,因此当程序退出时,内核(很好地)为您清理线程(或者至少这是可能发生的情况,取决于操作系统/编译器实现等),所以您没有看到线程以“不干净”结尾

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

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

如果希望主线程继续运行而不将
join
放在
run
函数中,则需要比当前拥有的代码多一点的代码,我不想假设代码的未来会是什么样子,但您可以查看有关
std::thread
作为类成员的问题(并在此范围内执行)


我希望这能有所帮助。

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

当您在名为run的方法中创建线程时,您希望打印两个内容(假设您取消注释了这些行),但是线程对象在创建它们的方法(run)的堆栈解编中被销毁

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


您可以将线程存储在向量中,类似于
std::vector

好的,这有点复杂,但我将尝试解释代码中的一些内容

当您在名为run的方法中创建线程时,您希望打印两个内容(假设您取消注释了这些行),但是线程对象在创建它们的方法(run)的堆栈解编中被销毁

实际上,您需要做两件事,首先创建线程并保留它们
g++ -o output/Practica2.out main.cpp -pthread -std=c++11