7

スレッドセーフなコンテナクラスを最初から作成しようとすると、アクセスメソッドから値を返すという問題が発生しました。たとえば、Windowsの場合:

myNode getSomeData( )
{
  EnterCriticalSection(& myCritSec);
  myNode retobj;
  // fill retobj with data from structure
  LeaveCriticalSection(& myCritSec);
  return retobj;
}

コードがクリティカルセクションをリリースした後、最初のスレッドが戻る前に別のスレッドがやって来てすぐに上書きできるため、このタイプのメソッドはスレッドセーフではないと思いretobjます。retobjでは、スレッドセーフな方法で発信者に戻るためのエレガントな方法は何でしょうか。

4

2 に答える 2

8

いいえ、各スレッドには独自のスタックがあるため、スレッドセーフretobjです。

ただし、それは確かに例外安全ではありません。クリティカルセクションをRAIIスタイルのオブジェクトでラップすると、それが役立ちます。何かのようなもの...

class CriticalLock : boost::noncopyable {
  CriticalSection &section;

public:
  CriticalLock(CriticalSection &cs) : section(cs)
  {
    EnterCriticalSection(section);
  }

  ~CriticalLock()
  {
    LeaveCriticalSection(section);
  }
};

使用法:

myNode getSomeData( )
{
  CriticalLock  lock(myCritSec);  // automatically released.
  ...
} 
于 2012-07-25T15:24:57.350 に答える
2

これは C++ であり、retobj自動ストレージ タイプであるため、スタックに格納されます。

すべてのスレッドには独自のスタックがあるため、値retobjが返される前に別のスレッドが値を上書きすることはできません。

于 2012-07-25T15:24:33.883 に答える