C++中的关键部分和返回值

Tho*_*eod 7 c++ winapi multithreading return-value critical-section

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

myNode getSomeData( )
{
  EnterCriticalSection(& myCritSec);
  myNode retobj;
  // fill retobj with data from structure
  LeaveCriticalSection(& myCritSec);
  return retobj;
}
Run Code Online (Sandbox Code Playgroud)

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

Rod*_*ddy 8

不,它是线程安全的,因为每个线程都有自己的堆栈,就在那里retobj.

但是,它当然不是例外安全的.在RAII风格的对象中包装关键部分会有所帮助.就像是...

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

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

  ~CriticalLock()
  {
    LeaveCriticalSection(section);
  }
};
Run Code Online (Sandbox Code Playgroud)

用法:

myNode getSomeData( )
{
  CriticalLock  lock(myCritSec);  // automatically released.
  ...
} 
Run Code Online (Sandbox Code Playgroud)