три задачи t1a t1b t2 ( в WinApi это Thread но сути не меняет )
нужно чтобы t1a и t1b выполнили некое действие, выставили готовность чтобы уйти в ожидание и дать управление задаче t2, задача t2 выполняет свое действие, приостанавливает свою работу и разрешает работу t1a и t1b
и снова по кругу
написал следующее (псевдокод):
Код
HANDLE events_t1_rdy[2] = { 0 };
HANDLE events_t2_rdy = { 0 };
events_t1_rdy[0] = CreateEvent( NULL, FALSE, FALSE, NULL ); // с автосбросом
events_t1_rdy[1] = CreateEvent( NULL, FALSE, FALSE, NULL ); // с автосбросом
events_t2_rdy = CreateEvent( NULL, TRUE, FALSE, NULL ); // с ручным сбросом
t1a()
{
t1a_todo();
SetEvent( events_t1_rdy[0] );
DWORD dwEvent = WaitForSingleObject( events_t2_rdy, 5000 );
assert( dwEvent == WAIT_OBJECT_0 );
}
t1b()
{
t1b_todo();
SetEvent( events_t1_rdy[1] );
DWORD dwEvent = WaitForSingleObject( events_t2_rdy, 5000 );
assert( dwEvent == WAIT_OBJECT_0 );
}
t2()
{
DWORD dwEvent = WaitForMultipleObjects( 2, events_t1_rdy, TRUE, 5000 );
assert( dwEvent == WAIT_OBJECT_0 );
t2_todo();
PulseEvent( events_t2_rdy );
}
HANDLE events_t2_rdy = { 0 };
events_t1_rdy[0] = CreateEvent( NULL, FALSE, FALSE, NULL ); // с автосбросом
events_t1_rdy[1] = CreateEvent( NULL, FALSE, FALSE, NULL ); // с автосбросом
events_t2_rdy = CreateEvent( NULL, TRUE, FALSE, NULL ); // с ручным сбросом
t1a()
{
t1a_todo();
SetEvent( events_t1_rdy[0] );
DWORD dwEvent = WaitForSingleObject( events_t2_rdy, 5000 );
assert( dwEvent == WAIT_OBJECT_0 );
}
t1b()
{
t1b_todo();
SetEvent( events_t1_rdy[1] );
DWORD dwEvent = WaitForSingleObject( events_t2_rdy, 5000 );
assert( dwEvent == WAIT_OBJECT_0 );
}
t2()
{
DWORD dwEvent = WaitForMultipleObjects( 2, events_t1_rdy, TRUE, 5000 );
assert( dwEvent == WAIT_OBJECT_0 );
t2_todo();
PulseEvent( events_t2_rdy );
}
дык вот, один раз в 100тысяч - милллион раз, одна задача (t1a или t1b ) не получает что t2 готов и ловлю dwEvent = 258 = 0x102 = TIMEOUT
как лечится ?