簡體   English   中英

如何使用 Boost 制作關鍵部分?

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

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