簡體   English   中英

使函數異常安全

[英]make function exception-safe

在我的多線程服務器中,我有一些somefunction() ,它需要使用EnterCriticalSection保護兩個獨立於彼此的全局數據。

somefunction()
{
  EnterCriticalSection(&g_List); 
  ...
  EnterCriticalSection(&g_Variable); 
   ...
  LeaveCriticalSection(&g_Variable);
   ...  
  LeaveCriticalSection(&g_List);
}

根據更好的程序員的建議,我將使用RAII包裝器。 例如:

class Locker
{
  public:
  Locker(CSType& cs): m_cs(cs)
  {
    EnterCriticalSection(&m_cs);
  }
  ~Locker()
  {
    LeaveCriticalSection(&m_cs);
  }
  private:
  CSType&  m_cs;
}

我的問題:somefunction()轉換為可以嗎? (將2個儲物櫃放在一個功能中):

somefunction()
{
 // g_List,g_Variable previously initialized via InitializeCriticalSection

    Locker  lock(g_List);
    Locker  lock(g_Variable);
    ...
    ...
}

您當前的解決方案有潛在的死鎖情況。 如果你有兩個(或更多) CSType以這種方式鎖定不同的順序,你將最終陷入死鎖。 最好的方法是原子地鎖定它們。 你可以在boost線程庫中看到這個例子。 shared_lockunique_lock可以在延遲模式下使用,因此首先為所有互斥對象准備所有raii對象,然后在一次調用鎖定函數時將它們全部鎖定

只要你在你的線程中保持鎖定順序就可以了。 你真的需要同時鎖定它們嗎? 此外,使用范圍鎖定,您可以添加范圍來控制何時解鎖,如下所示:

{
    // use inner scopes to control lock duration
    {
        Locker lockList (g_list);
        // do something
    } // unlocked at the end

    Locker lockVariable (g_variable);
        // do something
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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