[英]Critical Sections and return values in C++
在嘗試從頭開始創建一個線程安全的容器類時,我遇到了從訪問方法返回值的問題。 例如在Windows中:
myNode getSomeData( )
{
EnterCriticalSection(& myCritSec);
myNode retobj;
// fill retobj with data from structure
LeaveCriticalSection(& myCritSec);
return retobj;
}
現在我認為這種類型的方法根本不是線程安全的,因為在代碼釋放臨界區之后,另一個線程能夠出現並在第一個線程返回之前立即覆蓋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 ++, retobj
具有自動存儲類型,因此它存儲在堆棧中。
每個線程都有自己的堆棧,因此另一個線程在返回之前不能破壞retobj
的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.