оба считают от 0 до 100 и нужно сделать так:
main - 0
thread - 0
main - 1
thread - 1
можно создать общую переменную, которая будет хранить информацию о том, какой поток последним сделал действие (в данном случае это инкрементил какой-то свой счеткик) далее каждый поток смотрит эту переменную и делает свое дейтсвие только когда видит, что пришла его очередь
а как мне сделать join на 2 потока сразу, чтобы они не блокировались?
основной поток не нужно джоинить
а если у меня 2 объекта std::thread?
Джойнишь первый а потом второй
в любом случае в основном потоке нужно все сджоинить, и там он заблочится
std::mutex numMutex; std::condition_variable syncCond; auto bEvenReady = false; auto bOddReady = false; void printEven(int max){ for (unsigned i = 0; i <= max; i +=2){ std::unique_lock<std::mutex> lk(numMutex); syncCond.wait(lk, []{return bEvenReady;}); std::cout << i << ","; bEvenReady = false; bOddReady = true; syncCond.notify_one(); } } void printOdd(int max){ for (unsigned i = 1; i <= max; i +=2){ std::unique_lock<std::mutex> lk(numMutex); syncCond.wait(lk, []{return bOddReady;}); std::cout << i << ","; bEvenReady = true; bOddReady = false; syncCond.notify_one(); } } int main(){ auto max = 100; bEvenReady = true; std::thread t1(printEven, max); std::thread t2(printOdd, max); if (t1.joinable()) t1.join(); if (t2.joinable()) t2.join(); return 0; } вот тебе пример, два потока, один выводит только четные, второй нечетные, попеременная работа.
Обсуждают сегодня