c++ - C++ 中的临界区和返回值

标签 c++ multithreading winapi return-value critical-section

在尝试从头开始创建线程安全容器类时,我遇到了从访问方法返回值的问题。以 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/

相关文章:

c++ - Boost Asio,多线程和多io_service

java - GUI 花费的时间比计算的时间长并且减慢了整个过程

java - 带有 Thread 类和 Runnable 接口(interface)的输出

c++ - 使用 CreateProcess 函数

c++ - C++ 中的 NAPI native 模块正在部分执行(包括 std::thread)

c++ - 指针 vector 的迭代器

c++ - 什么是地址 0xbaddc0dedeadbead "Bad decode dead bead"

c++ - Qt从其他线程添加函数调用到事件循环

c++ - 使用 CMake 在 Windows 上设置 FLTK

C++ 和进程内存保护