0

私はThriftフレームワークを使用して、いくつかのアプリ間のIPCを処理しています。

私が解決したいわずかな競合状態の問題があるようですが、この解決策で発生したスレッドセーフの問題もあります。

TSimpleServer(Thrift code)には、次のようなコードがあります。

void TSimpleServer::serve()
{
   // ...
   while(!stop_) { // ... }
}

void TSimpleServer::stop()
{
   stop_ = true;
   // ...
}

したがって、この関数を実行する新しいスレッドを起動すると、次のようになります。

void workerFunction()
{
   // server is of type TSimpleServer
   server.serve();  // blocks here
}

そして、別のスレッドから停止してみてください。

void StopServer()
{
   server.stop();  // called from a separate thread
}

stop()からのスレッドが書き込みを行っているときに、serve()を実行しているスレッドがTSimpleServerの保護されていないstop_プロパティから読み取ることができるのではないでしょうか。

これは私が見落としている何らかの理由で問題ではありませんか?これを同期するための助けをいただければ幸いです。

4

1 に答える 1

1

これは問題にはならないはずです。プロセッサワード(4バイトまたは8バイト)に適合するプロパティアライン変数への書き込みはすべてアトミックです。言い換えると、別のスレッドが書き込みを行っている間は、その値を読み取ることはできません。したがって、コードは完全に正しいです。

于 2012-12-12T08:20:15.630 に答える