【发布时间】:2015-10-26 21:12:14
【问题描述】:
在询问有关互斥锁here 的问题后,我收到了有关死锁的警告。
我在下面整理的示例是否是避免死锁的合理方法?
class Foo
{
public:
Foo();
void Thread();
int GetWidgetProperty();
int GetGadgetProperty();
private:
Widget widget_;
Gadget gadget_;
VDK::MutexID widgetLock;
VDK::MutexID gadgetLock;
};
Foo::Foo()
: widget_(42)
, gadget_(widget_)
{
widgetLock = VDK::CreateMutex();
gadgetLock = VDK::CreateMutex();
}
void Foo::Thread()
{
while(1)
{
VDK::AcquireMutex(widgetLock);
// Use widget
VDK::ReleaseMutex(widgetLock);
VDK::AcquireMutex(widgetLock);
VDK::AcquireMutex(gadgetLock);
// use gadget
VDK::ReleaseMutex(widgetLock);
VDK::ReleaseMutex(gadgetLock);
}
}
int Foo::GetWidgetProperty()
{
VDK::AcquireMutex(widgetLock);
return widget_.GetProp();
VDK::ReleaseMutex(widgetLock);
}
int Foo::GetGadgetProperty()
{
VDK::AcquireMutex(widgetLock);
VDK::AcquireMutex(gadgetLock);
return gadget.GetProp();
VDK::ReleaseMutex(widgetLock);
VDK::ReleaseMutex(gadgetLock);
}
由于调用 GetGadgetProperty 可能会导致使用小部件,我猜我们还需要在这里用锁保护自己。我的问题是,我是否以正确的顺序要求和释放它们?
【问题讨论】:
-
努力始终以相同的顺序锁定。这个SO post 非常详细,正是您要找的。span>
-
我不明白你的代码。您是否正在尝试实现自己的并发原语?你有什么理由不使用 C++11 的线程支持库吗?
-
我正在为不支持 C++11 的嵌入式系统进行开发。 VDK 是 Analog Devices 的内核。
-
我在嵌入式编程中的方法是尽可能避免这样的锁定事件。我更喜欢演员的方法。您的活动 C++ 对象(其中包含一个线程)接收消息并对其进行操作,然后根据需要发送消息。这样,您通常需要正确锁定的唯一锁定与消息队列有关。