Критические секции. C++

196
30 мая 2017, 02:39

Здраствуйте, как правильно поставить критическую секцию в такой функции?

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;
}
Answer 1

Правильно — за пределами цикла.

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;
}

Освобождение секции внутри цикла чревато минимум двумя вещами:

  1. Если в массиве не окажется ни одного элемента, равного двум, критическая секция не будет освобождена.

  2. А если в массиве будет больше одного такого элемента, критическая секция будет высвобождена больше раз, чем вы её захватили.

И да, зачем вам нужен return 0; после ExitThread(0);? Вторая функция и так обеспечивает безусловный выход из потока.

READ ALSO
Header файлы и их проблема подключения

Header файлы и их проблема подключения

Работаю над проектом с компилятором MinGW32, компилирую в cmdexe и столкнулся с проблемой: Создал header-файл(UIClass

263
Помогите оптимизировать код

Помогите оптимизировать код

В задаче на вход программе дается количество невыполненных заданий и время, которого не хватает на решение этих заданий

258
Потоки. Приоритеты

Потоки. Приоритеты

Доброго времени сутокКакие потоки можно назвать фоновыми? Потоки с меньшим приоритетом можно назвать фоновыми относительно потока с большим...

270