Пытаюсь разобраться в многопоточности и 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;
}
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Код C++, Visual Studio 2019, urlmon подключен, вызываю так:
Я хочу по битам считать определенную область памяти, первый вариант работает, второй - нет, хотя делает почти то же самое