私は2つのスレッドによってアクセスされる共有ベクトルを持っています。共有ベクトルアトムブールとの同期
スレッドAの関数はベクトルにプッシュし、スレッドBの関数は処理のためにベクトルを完全にスワップします。
MovetoVec(PInfo* pInfo)
{
while(1)
{
if(GetSwitch())
{
swapBucket->push_back(pInfo);
toggles = true;
break;
}
else if(pInfo->tryMove == 5)
{
delete pInfo;
break;
}
pInfo->tryMove++;
Sleep(25);
}
}
スレッドAがtrueにアトミックブールtoggles
を取得しようとベクター中に押し込む。(上記MoveToVec
機能スレッドの多くの数によって呼び出されます)。 GetSwitchがここ
GetSwitch()
{
if(toggles)
{
toggles = false;
return TRUE;
}
else
return FALSE;
}
toggles
のように定義された関数は、ベクトルがGetSwitchがfalseを返す場合threadBは何もしません
GetClassObj(vector<ProfiledInfo*>* toSwaps)
{
if(GetSwitch())
{
toSwaps->swap(*swapBucket);
toggles = true;
}
}
あるスワップスレッドBからatomic_bool.And別の関数です。ここで私はどんなロックを使用しています。それはほとんどの場合に機能します。しかし、swapBucketにあるpInfo
オブジェクトのうちの1つはNULLです。私はそれが同期不良のためだということを知る必要があります。
私はこのタイプのGetSwitch()ロジックに従い、ロックによって引き起こされるオーバーヘッドを無視しています。私はこれをドロップアウトし、ミューテックスまたはクリティカルセクションのものに戻すべきですか?