言葉の問題:
私のアプリケーションでは、シリアルポートから読み取るクラスがあります。これは、COMポートの処理にWindowsプリミティブを使用し、非同期読み取り用のスレッドを備えていました。Boost.AsioやBoost.ThreadなどのBoostライブラリを使用して、これをWindowsプリミティブから変換しようとしています。
Windowsポートでは、IOスレッドにいくつかのMFC CEvent変数があり、それぞれがメッセージを表していました:読み取り要求、書き込み要求、読み取り完了、書き込み完了、IOキャンセル。これらはWaitForMultipleObjectsで待機されていました。
私が抱えている問題は、Boost.ThreadにCEventとWaitForMultipleObjectsのどちらにも類似物がないように見えることです。最も近いのは、これらを破棄してイベントをブール値のセットに置き換え、ブール値が変更されるたびにnotify_all()関数が呼び出されるcondition_variableを使用することです。
ただし、boost :: condition_variableは、CEventとは重要な点で異なります。待機していないときにCEventが通知された場合、次の待機はすぐに成功します。boost :: condition_variableを使用すると、待機していない場合、通知関数は無視されます。
これは、フラグのチェックと、通知が失われる可能性のあるcondition_variableの待機との間に常にギャップがあることを意味します。これにより、スレッドがハングします。
誰かがこの問題の解決策を知っていますか?
コードの問題:
// Old IO Thread
CEvent msg_cancel;
CEvent msg_read_req;
CEvent msg_write_req;
CEvent msg_read_comp;
CEvent msg_write_comp;
CEvent events[] = {
msg_cancel,
msg_read_req,
msg_write_req,
msg_read_comp,
msg_write_comp
};
bool cancel = false;
while (!cancel)
{
switch(WaitForMultipleObjects(5, events, false, INFINITE))
{
case WAIT_OBJECT_0 :
// msg_cancel
cancel = true;
break;
...
}
}
Boost.Threadでそれをエミュレートする方法は?