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