簡體   English   中英

C ++中的關鍵部分和返回值

[英]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 &section;

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM