gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 01:01:22 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com