Здраствуйте, как правильно поставить критическую секцию в такой функции?
DWORD WINAPI Set1(LPVOID){
EnterCriticalSection (&cs) ;
for (int i=0; i<amount; i++){
if (Flowers[i]==2 ){
Flowers[i]=1;
cout << "Set1 ";
cout << endl;
}
}
LeaveCriticalSection (&cs);
ExitThread(0);
return 0;
}
Правильно — за пределами цикла.
DWORD WINAPI Set1(LPVOID)
{
EnterCriticalSection (&cs);
for (int i = 0; i < amount; i++)
{
if (Flowers[i] == 2)
{
Flowers[i] = 1;
std::cout << "Set1 " << endl;
}
}
LeaveCriticalSection (&cs);
ExitThread(0);
return 0;
}
Освобождение секции внутри цикла чревато минимум двумя вещами:
Если в массиве не окажется ни одного элемента, равного двум, критическая секция не будет освобождена.
А если в массиве будет больше одного такого элемента, критическая секция будет высвобождена больше раз, чем вы её захватили.
И да, зачем вам нужен return 0; после ExitThread(0);? Вторая функция и так обеспечивает безусловный выход из потока.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей