Не могу понять почему программа с std::thread, то зависает при запуске, а то работает нормально, компилятор MinGW-w64. Видимо ловлю в какойто момент взаимную блокировку, но вот понять в какой не могу. Вот код:
#include
using namespace std;
mutex m0,m1,m2,m3,m4;
condition_variable c1,c2;
vector
void add_vect(int i) {
lock_guard
void gen() {
unique_lock
void ex1() {
unique_lock
void ex2() {
unique_lock
int main()
{
thread tgen(gen);
thread t1(ex1);
thread t2(ex2);
tgen.join();
t1.join();
t2.join();
for (vector
return 0;
}
По времени потоки должны работать так:
Ответ
Вот вам скелет, должно в принципе работать. Обошёлся одним общим мьютексом.
#include
using namespace std;
mutex global;
condition_variable allow_ex_cond;
int allow_iteration = -1;
condition_variable finished_ex_cond;
int finished_ex = 0;
bool shutdown = false;
const int num_workers = 2;
void gen()
{
cout << "coordinator working, iteration -1" << endl;
const int maxiterations = 3;
for (int i = 0; i < maxiterations; i++)
{
{
unique_lock
// start new iteration
finished_ex = 0;
allow_iteration = i;
shutdown = (i == maxiterations - 1);
allow_ex_cond.notify_all();
// wait for threads to finish task
finished_ex_cond.wait(l, [] { return finished_ex == num_workers; });
}
// do work
cout << "coordinator working, iteration " << i << endl;
}
}
void excommon(int num)
{
int iteration = 0;
while (true)
{
// do work
cout << "worker " << num << ", iteration " << iteration << endl;
{
unique_lock
// signal finished
finished_ex++;
if (finished_ex == num_workers)
finished_ex_cond.notify_all();
// check exit
if (shutdown)
break;
iteration++;
// wait for signal to continue
allow_ex_cond.wait(l, [iteration] { return allow_iteration == iteration; });
}
}
cout << "worker " << num << " shutting down" << endl;
}
void ex1()
{
excommon(1);
}
void ex2()
{
excommon(2);
}
int main(int argc, char* argv[])
{
thread tgen;
{
unique_lock
thread t1(ex1);
thread t2(ex2);
tgen.join();
t1.join();
t2.join();
return 0;
}
Комментариев нет:
Отправить комментарий