[英]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_lock和unique_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.