在尝试从头开始创建线程安全容器类时,我遇到了从访问方法返回值的问题。例如在 Windows 中:

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

现在我认为这种类型的方法根本不是线程安全的,因为在代码释放临界区之后,另一个线程能够出现并在第一个线程返回之前立即覆盖 retobj。那么以线程安全的方式将 retobj 返回给调用者的优雅方式是什么?

最佳答案

不,它是线程安全的,因为每个线程都有自己的堆栈,这就是 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.
  ...
}

关于c++ - C++ 中的临界区和返回值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11653062/

10-11 18:34