在尝试从头开始创建线程安全容器类时,我遇到了从访问方法返回值的问题。例如在 Windows 中:
myNode getSomeData( )
{
EnterCriticalSection(& myCritSec);
myNode retobj;
// fill retobj with data from structure
LeaveCriticalSection(& myCritSec);
return retobj;
}
现在我认为这种类型的方法根本不是线程安全的,因为在代码释放关键部分后,另一个线程能够出现并立即覆盖retobj
在第一个线程返回之前。那么什么是优雅的返回方式retobj
以线程安全的方式传递给调用者?
不,它是线程安全的,因为每个线程都有自己的堆栈,这就是retobj
is.
但是,它肯定不是异常安全的。将关键部分包装在 RAII 样式的对象中会有所帮助。就像是...
class CriticalLock : boost::noncopyable {
CriticalSection §ion;
public:
CriticalLock(CriticalSection &cs) : section(cs)
{
EnterCriticalSection(section);
}
~CriticalLock()
{
LeaveCriticalSection(section);
}
};
Usage:
myNode getSomeData( )
{
CriticalLock lock(myCritSec); // automatically released.
...
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)