使功能异常安全
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
s,以这种方式锁定了不同的顺序,则最终会陷入死锁。最好的方法是将它们都锁定。您可以在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
}
相关文章:
- C++代码中的异常安全
- 编写"anti-lack of memory"异常安全代码
- std:string::substr 异常安全吗?
- 如何以异常安全的方式使用放置新?
- 通过引用从 c++ 函数异常返回对象是否安全
- 异常安全服务器
- 实现 std::vector::p ush_back 强异常安全
- 标准::unique_ptr和异常安全
- 如何使用QThreads使无锁生产者-消费者线程交换更加异常安全
- 使功能异常安全
- 与构造函数参数相关的异常安全的习语
- uninitialized_copy() 异常安全吗?
- 为什么我们需要 RAII 来解决异常安全问题
- 异常安全构造函数
- 关于 swap() 操作的异常安全 - 这有什么问题?
- std::vector::擦除异常安全
- 异常安全 - 用于可靠回滚对象状态的模式
- 异常安全的 for 循环
- 异常安全代码和移动语义
- 向量::插入的异常安全保证是什么?