с мьютексом потоки выполняются поочередно, но с критической секцией это совсем не так.
#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <omp.h>
using namespace std;
int global = 100;
HANDLE ht1, ht2;
CRITICAL_SECTION cs;
DWORD WINAPI ThreadProc1(LPVOID lpParameter ) {
int i, j;
for (j=1; j <= 12; j++) {
EnterCriticalSection(&cs);
i = global;
i++;
Sleep (1);
global = i;
printf_s( "%4s %4d \n", " 1 th", i );
LeaveCriticalSection(&cs);
}
return 0;
}
DWORD WINAPI ThreadProc2 (LPVOID lpParameter) {
int i, j;
for (j=1; j <= 12; j++) {
EnterCriticalSection(&cs);
i = global;
i++;
Sleep (1);
global = i;
printf_s( "%4s %4d %4d \n", " 2 th", i, j );
LeaveCriticalSection(&cs);
}
return 0;
}
int _tmain(int argc, _TCHAR* argv[]) {
HANDLE msh[2];
InitializeCriticalSection(&cs);
ht1 = CreateThread(NULL, 0, &ThreadProc1, NULL, 0, NULL);
ht2 = CreateThread(NULL, 0, &ThreadProc2, NULL, 0, NULL);
msh[0] = ht1;
msh[1] = ht2;
Sleep(500);
DeleteCriticalSection(&cs);
return 0;
}
Я получаю этот результат
https://i.imgur.com/w45qRoU.png
с мьютексом, результат нормальный, я ожидал такой же результат для критической секции
https://i.imgur.com/IlqcyNT.png