thread.join() Почему потоки вызываются в случайном порядке? С++

162
13 февраля 2022, 15:00

Пытаюсь разобраться в многопоточности и mutex. По задумке сначала должен выполниться thread Calc(Stream), после его окончания должен выполниться thread Draw(DrawStream). Но, потоки при каждом запуске программы выполняются в разном порядке. Я пытался менять местами

    Calc.join();
    Draw.join();

Но это никак не помогло. Можете обьяснить в чем причина такого поведения программы?

#define _USE_MATH_DEFINES
#define _CRT_SECURE_NO_WARNINGS
#include <math.h>
#include <windows.h>
#include <conio.h>
#include <stdio.h>
#include <string>
#include <clocale>
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
float pointsX[6000] , pointsY[6000];
std::mutex _mutex;
DWORD WINAPI Stream() {
    _mutex.lock();
    printf("Запуск первого потока\n");
    int i = 0;
    float h = M_PI / 180, x, y, a = 30, r = 30;
    float f = -3;
    while (f <= 3) {
        x = a + r * cos(f);
        y = a * sin(f) / cos(f) + r * sin(f);
        pointsX[i] = x;
        pointsY[i] = y;
        printf("x = %f     y = %f\n", x, y);
        i++;
        f += h;
    }
    printf("Окончание первого потока\n");;
    _mutex.unlock();
    return 0;
}
DWORD WINAPI DrawStream() {
    _mutex.lock();
    printf("Запуск второго потока\n");
    HWND hwnd = GetConsoleWindow();
    HDC hdc = GetDC(hwnd);
    int i = 0;;
    Sleep(100);
    while (pointsX[i+1] != NULL) {
        SetPixel(hdc, 300 + pointsX[i], 50 + pointsY[i], RGB(255, 255, 255));
        i++;
    }
    ReleaseDC(hwnd, hdc);
    printf("Окончание второго потока\n");
    _mutex.unlock();
    return 0;
}

int main()
{
    setlocale(LC_ALL, "RUSSIAN");
    thread Calc(Stream);
    thread Draw(DrawStream);
    Calc.join();
    Draw.join();
    _getch();
    return 0;
}
READ ALSO
Ругается компилятор

Ругается компилятор

Ошибка компиляции на cols во вложенном цикле:

89
Выводится лишний текст в окне winapi

Выводится лишний текст в окне winapi

Подскажите, Как исправить ввод лишних символов?

77
UrlDownloadToFile ошибка E_ABORT Operation aborted

UrlDownloadToFile ошибка E_ABORT Operation aborted

Код C++, Visual Studio 2019, urlmon подключен, вызываю так:

85
Почему bitset обнуляется

Почему bitset обнуляется

Я хочу по битам считать определенную область памяти, первый вариант работает, второй - нет, хотя делает почти то же самое

127