[英]How do I make a critical section with Boost?
對於我的跨平台應用程序,我已經開始使用 Boost,但我無法理解如何實現代碼來重現 Win32 的關鍵部分或.Net 的lock
的行為。
我想編寫一個可以從不同線程調用的方法Foo
來控制對共享字段的寫操作。 應該允許在同一線程內進行遞歸調用(Foo() -> Foo())。
在 C# 中,這個實現非常簡單:
object _synch = new object();
void Foo()
{
lock (_synch) // one thread can't be lock by him self, but another threads must wait untill
{
// do some works
if (...)
{
Foo();
}
}
}
使用 boost,您可以使用 boost::lock_guard<> class:
class test
{
public:
void testMethod()
{
// this section is not locked
{
boost::lock_guard<boost::recursive_mutex> lock(m_guard);
// this section is locked
}
// this section is not locked
}
private:
boost::recursive_mutex m_guard;
};
PS 這些類位於Boost.Thread庫中。
這是使用 Boost.Thread 重寫您的示例:我刪除了評論,但除此之外,它應該是一對一的重寫。
boost::recursive_mutex mtx;
void Foo()
{
boost::lock_guard<boost::recursive_mutex> lock(mtx);
if (...)
{
Foo();
}
}
文檔可以在 這里找到。
請注意,Boost 定義了許多不同的互斥體類型。 因為您的示例顯示了以遞歸方式獲取鎖,所以我們至少需要使用boost::recursive_mutex
。
也有不同類型的鎖。 特別是,如果你想要一個讀寫器鎖(這樣多個讀者可以同時持有鎖,只要沒有作者擁有鎖),你可以使用boost::shared_lock
代替lock_guard
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.