c++ - C++同步三个线程

标签 c++ multithreading

我有以下程序(编造的例子!):

#include<thread>
#include<mutex>
#include<iostream>

class MultiClass {
    public:
        void Run() {
            std::thread t1(&MultiClass::Calc, this);
            std::thread t2(&MultiClass::Calc, this);
            std::thread t3(&MultiClass::Calc, this);
            t1.join();
            t2.join();
            t3.join();
        }
    private:
        void Calc() {
            for (int i = 0; i < 10; ++i) {
                std::cout << i << std::endl;
            }
        }
};

int main() {
    MultiClass m;
    m.Run();
    return 0;
}

我需要的是按照以下方式同步循环迭代,但我想不出一个解决方案(我已经使用互斥锁摆弄了大约一个小时,但找不到组合): t1t2 应进行一次循环迭代,然后 t3 应进行一次迭代,然后再次 t1t2 应该做一个,然后 t3 应该做一个。

所以你看,我需要 t1t2 同时做一些事情,在一次迭代后,t3 应该自己做一次迭代.

您能否指出我将如何实现这一目标?就像我说的,我一直在用互斥量尝试这个​​,但无法想出解决方案。

最佳答案

如果你真的想用给定的线程结构手动完成这个,你可以使用这样的东西*:

class SyncObj {
    mutex mux;
    condition_variable cv;  
    bool completed[2]{ false,false };

public:
    void signalCompetionT1T2(int id) {
        lock_guard<mutex> ul(mux);
        completed[id] = true;
        cv.notify_all();
    }
    void signalCompetionT3() {
        lock_guard<mutex> ul(mux);
        completed[0] = false;
        completed[1] = false;
        cv.notify_all();
    }
    void waitForCompetionT1T2() {
        unique_lock<mutex> ul(mux);             
        cv.wait(ul, [&]() {return completed[0] && completed[1]; });         
    }
    void waitForCompetionT3(int id) {
        unique_lock<mutex> ul(mux);         
        cv.wait(ul, [&]() {return !completed[id]; });           
    }       
};

class MultiClass {
public:
    void Run() {
        std::thread t1(&MultiClass::Calc1, this);
        std::thread t2(&MultiClass::Calc2, this);
        std::thread t3(&MultiClass::Calc3, this);
        t1.join();
        t2.join();
        t3.join();
    }
private:
    SyncObj obj;
    void Calc1() {
        for (int i = 0; i < 10; ++i) {
            obj.waitForCompetionT3(0);
            std::cout << "T1:" << i << std::endl;
            obj.signalCompetionT1T2(0);
        }           
    }
    void Calc2() {
        for (int i = 0; i < 10; ++i) {
            obj.waitForCompetionT3(1);
            std::cout << "T2:" << i << std::endl;
            obj.signalCompetionT1T2(1);
        }
    }
    void Calc3() {      
        for (int i = 0; i < 10; ++i) {
            obj.waitForCompetionT1T2();
            std::cout << "T3:" << i << std::endl;
            obj.signalCompetionT3();
        }       
    }
};

然而,这只是一种合理的方法,如果每次迭代的计算量很大,以至于您可以忽略同步开销。如果不是这种情况,您可能最好看看合适的并行编程库,例如英特尔的 tbb 或微软的 ppl。

*)注意:此代码未经测试和优化。我只是写它来展示一般结构的样子

关于c++ - C++同步三个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33499058/

相关文章:

c++ - C++中带初始化参数的构造函数

c++ - 使用统一缓冲区对象进行批量渲染

c++ - 为什么在 STL 中允许 <double>

java - 限制函数调用的时间

c# - NServicebus - 一个端点多个处理程序线程

java - Android AsyncTask.THREAD_POOL_EXECUTOR 与自定义 ThreadPool 与 Runnables

c++ - C4838 警告与 const char* 数组的数组初始化

c++ - 使用 C++ 将 char 数组转换为 int

Android - 如何正确执行后台线程?

java - 如何正确使用带套接字的 HandlerThread?