Re[7]: блокировка трэда
От: Delphi  
Дата: 27.02.05 09:10
Оценка:
Здравствуйте, Alexmoon, Вы писали:


A>9. В методе добавления элемента в список, в самом конце выставление события в сигнальное состояние.

A>10.В методе извлечения в конце с проверкой очереди на пустоту сбрасывание, если элементов нет.

Предположим, что кол-во элементов нам известно(для упрощения схемы). Пусть их будет, например, 5. =>

.........
HANDLE hEvent; // глобальная переменная, так же как и thread;
.........
i = 0;
while (i < 5) {
     hEvent = CreateEvent(NULL, false, false, "asda");

     thread = AfxBeginThread((AFX_THREADPROC)  Our_Func, 
                element[i], 
                THREAD_PRIORITY_NORMAL, 
                0, 
                0, 
                NULL);
     SetEvent(hEvent); // выставляем событие в сигнальное состояние, чтобы Our_Func запустилась 
     ResetEvent(hEvent); // сбрасываем событие
i++;

}
.............

...Our_func..() 
{
     WaitForSingleObject(hEvent,INFINITE); // ожидаем сигнала
     ................
     
     ................
     SetEvent(hEvent);
     return true;
}


Так вот, если у нас всего 2 элемента, то все хорошо, однако при большем количестве накапливается куча ожидающих своего часа событий, и как только 1-й завершившийся трэд делает SetEvent(hEvent), они все дружно просыпаются...., можно конечно в цикл запихать WaitForSingleObject(hEvent,INFINITE), но тогда смысл трэдов теряется.
Да и с SetEvent(hEvent) внутри цикла нужно что-то делать, т.к. это неправильно, да и по логике работать не должно
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.