c++ - 在 C++ 中并行运行线程

标签 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);

            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/

相关文章:

c++ - 将图像从网络摄像头转换为灰度opencv

c++ - 只锁定两个可能的互斥量之一

c++ - 共享内存中的std::mutex无法正常工作

java - 同步锁由最短等待线程获取

c++ - Openmp渲染bmp图片

c++ - 如何使用 Qt 5.6 在高 dpi 上获得清晰的 UI?

python - 多处理列表中的多个文件

deep-learning - 使用 PyTorch DistributedDataParallel 在多个节点上训练时进程卡住

spring - Web 应用程序中的多线程和并行处理 - 需要建议

cuda - CUDA 默认流与创建流的并发