Как заставить поток ждать?

Есть несколько потоков, выполняющих функцию рисования линий из символов, и нужно заставить один поток ждать, пока дорисует другой/несколько других, при этом не прибегая к WaitForSingleObject. =>(0,1),3,2,4 | 4,(2,3),(1,0)<= в таком порядке они должны двигаться, однако как это реализовать понятия не имею.

#include <windows.h>
#include <iostream>
using namespace std;

HANDLE hConsole;
CRITICAL_SECTION cs;

COORD pos;

//Рисование
void draw(int x, int y, char symbol) {
    EnterCriticalSection(&cs);
    pos.X = x;
    pos.Y = y;
    SetConsoleCursorPosition(hConsole, pos);
    cout << symbol;
    LeaveCriticalSection(&cs);
}

#define X_MIN 20
#define X_MAX 40

class CylParams {
public:

    int row;
    int delay;

    bool iOnRight;
    bool iOnLeft;

    CylParams() {
        iOnRight = false;
        iOnLeft = false;
    };

};

//Ход цилиндра
DWORD WINAPI f0(PVOID param) {

    CylParams* p = (CylParams*)param;
    int row = p->row;
    while (1) {
        if (p->iOnLeft) {
            for (int x0 = X_MIN; x0 < X_MAX; x0++) {
                draw(x0, row, '#');
                Sleep(p->delay);
            }
            p->iOnRight = true;
        }
        if (p->iOnRight) {
            for (int x0 = X_MAX; x0 > X_MIN; x0--) {
                draw(x0, row, ' ');
                Sleep(p->delay);
            }
            p->iOnLeft = true;
        }
    }

    //return 0;
}

int main() {

    hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    InitializeCriticalSection(&cs);

    //=>(0,1),3,2,4 | 4,(2,3),(1,0)<=
    CylParams params[5];

    for (int i = 0; i < 5; i++) {
        params[i].row = 3 + i * 2;
        params[i].delay = 30 + i * 30;
    
        CreateThread(NULL, 0, f0, params + i, 0, NULL);
    }
    
    params[0].iOnLeft = true;
    params[1].iOnLeft = true;

    system("pause > 0");

    return 0;
}

Ответы (0 шт):