C должен ждать, пока произойдут две вещи, поэтому наиболее логичным является то, что он ожидает двух CEvent
объектов с автосбросом: один устанавливается A, а другой - B.
Когда C завершен, A и B должны затем ждать уведомления.Поскольку существует два потока, и оба должны проснуться, естественным является использование другой пары объектов CEvent
с автосбросом, по одному для каждого из A и B. После этого C может установить оба этих параметра.
Семафор со счетчиком 2 будет работать для пробуждения C --- C ждет дважды, и каждый из A и B уведомляет --- но это означает, что C должен проснуться после первого уведомления, чтобы ждатьво-вторых, это не идеально.
Использование семафора со счетом 2 для последующего пробуждения A и B может привести к краже пробуждений и путанице.С сигнализирует семафор дважды.Просыпается и принимает сигнал, выполняет его обработку и уведомляет C, а затем снова ожидает семафор.Поскольку B еще не проснулся, семафор все еще доступен, поэтому A снова его берет.В то же время B не застрял, так как он не получит другого сигнала, а C застрял, поскольку он будет ожидать следующего значения от B.
Альтернативой является использование API Windows Condition Variable вместо событий, но, похоже, для этого нет оболочки MFC.Смотри http://msdn.microsoft.com/en-us/library/ms682052%28VS.85%29.aspx