1

私のクラスでは、CreateThread(NULL,0,Execute1,this...)メソッドを使用してスレッドを作成します。

DWORD WINAPI Execute1(LPVOID lpParam) {
CoInitialize(NULL);
CVC1Dlg *pdlg=(CVC1Dlg *) lpParam;

次に、このスレッドから pdlg メソッドを呼び出します。

pdlg->someMethod();

このスレッドからこのメソッドを呼び出すと、このメソッドが同時にメイン スレッドから呼び出された場合、どうなりますか? ミューテックスのような同期方法を使用する必要がありますか? そして、ミューテックスを呼び出す必要がある正確な場所はどこですか?

CVC1Dlg メソッドで使用する必要があるというのは正しいですか? このようなもの:

CVC1Dlg ::CVC1Dlg () {
  g_hMutex=CreateMutex(...)
}

void CVC1Dlg ::setStatus(int aStatus) {
  ::WaitForSingleObject(g_hMutex, INFINITE);
  iStatus=aStatus;
  ::ReleaseMutex(g_hMutex);
}
4

2 に答える 2

0

このスレッドからこのメソッドを呼び出すと、このメソッドが同時にメインスレッドから呼び出された場合、どうなりましたか。mutexのような同期メソッドを使用する必要がありますか?そして、正確にどこでミューテックスを呼び出す必要がありますか?

ミューテックスを使用して状態をアトミックに変更しますが、必ずしも2つの異なるスレッドが同じメソッドに同時にアクセスするのを防ぐ必要はありません。コードではなくデータの観点から考えてください。

メソッドがメンバー変数を読み取り、変更された値を書き戻す場合は、それを不可分操作にする必要があります。

iStatusあなたの例は本質的に正しいですが、メンバー変数にアクセスする他のメソッドもミューテックス(またはクリティカルセクション)で保護する必要があることを示していません。

于 2012-10-15T12:28:25.440 に答える
0

someMethodint を設定するだけの場合は で何をするかによって異なります。std::atomicパフォーマンスboost::atomicのために、MFC を使用して GUI オブジェクトにアクセスするか、非マルチスレッド COM オブジェクト (たとえば OCX など) を呼び出す場合は、次のようにします。そのスレッドから呼び出すのではなく、メッセージを DLG に投稿/送信し、WindowProcその DLG でメッセージを受信して​​アクションを実行します。ミューテックスまたはクリティカル セクションは、C++ 構造 (リスト、文字列、またはmy_struct)!

于 2012-10-15T12:50:10.377 に答える