質問

のネーミング機能のようにこのは一部の複雑なものとなる。が正しいということはそうでないもののようになります:

準備 CRITICAL_SECTION cs;int*p=malloc(sizeof(int));//配分のサイト InitializeCriticalSection(&cs);//ヒントが最初に書き

スレッド#1 { *p=1;//初書き }

レストラン#2 { EnterCriticalSection(&cs);*p=2;//秒書 LeaveCriticalSection(&cs);}

私は書き込みを取得する単一のスレッド:

Run()
{
// some code
m_bIsTerminated = TRUE;
// some more code
}

そして、私は読み取ることが別のスレッド(潜在的に同じ時間):

Terminate()
{
// some code
if( m_bIsTerminated )
{
m_dwThreadId = 0;
m_hThread = NULL;
m_evExit.SetEvent();
return;
}
// even more code
}

どの解決このレースですか?重要部を示すものではありません。にInterlockedExchangeAdd()より多いので便利なのでしょう?

役に立ちましたか?

解決

InterlockedExchangeAdd使用を追加する値を整数値としての原子操作ることを意味なければいけません使用に重要です。これも削除し、リスクの行き詰まりの場合のスレッドが例外をスローしまれるようにする必要がありまないようご注意下さいロックの種類とその防止その他のスレッドから取得するロックになっています。

のためのシナリオにおい動画ファイルをダウンロード用の連動...-機能には、使用イベント(CreateEvent,SetEvent,WaitForSingleObject)するかのように私は自分でする必要が待以上のオブジェクト(まお待ちゼロ秒後にシナリオ).

Upd:を利用した揮発性のための変数が作業しなおすすめ旅行を企画しています http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2016.htmlhttp://www-949.ibm.com/software/rational/cafe/blogs/ccpp-parallel-multicore/tags/c%2B%2B0x を備えています。

ただ、携帯型のこれらを実現するために、 ブ::スレッド.

他のヒント

このケースではありませんレースの条件です。変数はリセット後にFALSEですか?とはいえください"金型"のスイッチのスレッドですよね?そしてなにより同期ができない。

のInterlockedXXX家族の機能を使用しインテル®プロセッサーの原3-オペランドコマンド(XADDとCMPXCNG).んでいく重要です。とのないスレッドに-安全に配InterlockedCompareExchange().

UPD:のマークを変数として激しい動きを示している。

確m_bIsTerminatedが不安定であり、すばokです。その一方かかってくるということになるん//一部のコードが設定後に"終了"があります。うな変動を示す?

の"レースの状態"であるなどのさまざまな要素//コードが実行することができ異なる。変数はならない。の目標において実に確定することにあります。そしている必要条件変数待ちの一つのスレッドに設定しています。だいて実行同時に、重要な部となっております。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top