gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:17:51 25 4
gpt4 key购买 nike

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

#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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com