同様の質問が以前に尋ねられたことをよく知っており、操作がまったくアトミックではない可能性が高いことも認識していますが、私はまだ怠惰な好奇心から尋ねており、それをアトミックにする方法があることを願っています.
状況: 内にstruct
、 という unsigned char 変数がありますBusy
。(ただし、そこから移動して自立することはできます)。
この変数Busy
は、2 つの並行スレッドによって変更されます。1 つはスケジューリング時にビットを設定し、もう 1 つはスケジュールされたアクションの完了時にビットをクリアします。
現在、スケジュールは次のようになっています。
while(SEC.Busy&(1 << SEC.ReqID))
if(++SEC.ReqID == 5) SEC.ReqID = 0;
sQuery.cData[2] = SEC.ReqID;
ビットマスクのクリアは次のようになります。
SEC.Busy &= ~(1 << sQuery->cData[2]);
cData[2] は基本的に、どのスロットがネットワーク上で使用されているかに関する情報を運び、別のスレッドのコールバックを介して返されます。
質問: SEC.Busy (この問題のある状況で唯一の変数) が、mutex やクリティカル セクションなどを使用せずに同時に変更しようとする 2 つのスレッドによって引き裂かれないようにするにはどうすればよいですか?可能であれば同類の?
SEC.Busy の内容をローカル変数に割り当て、それを変更してから変数を書き戻すことも試みましたが、残念ながら、この操作もアトミックではないようです。
現在、Borland C++ Builder 6 を使用していますが、GCC ソリューションでも問題ありません。
どうもありがとうございました。