【问题标题】:How do I make a critical section with Boost?如何使用 Boost 制作关键部分?
【发布时间】:2011-10-27 08:33:40
【问题描述】:

对于我的跨平台应用程序,我已经开始使用 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();
        }
    }
}

【问题讨论】:

    标签: c++ multithreading boost synchronization critical-section


    【解决方案1】:

    这是您的示例的重写,使用 Boost.Thread:我删除了 cmets,但除此之外,它应该是一对一的重写。

    boost::recursive_mutex mtx;
    
    void Foo()
    {
        boost::lock_guard<boost::recursive_mutex> lock(mtx);
        if (...) 
        {
           Foo();
        }
    }
    

    文档可以在here找到。

    请注意,Boost 定义了许多不同的互斥体类型。因为您的示例显示了递归获取锁,所以我们至少需要使用boost::recursive_mutex

    还有不同类型的锁。特别是,如果你想要一个读写器锁(这样多个读者可以同时持有锁,只要没有作者拥有锁),你可以使用boost::shared_lock而不是lock_guard

    【讨论】:

      【解决方案2】:

      借助 boost,您可以使用 boost::lock_guard 类:

      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 库中。

      【讨论】:

      • 你的推荐很有用。我已经修复了我的错误,但是我有性能抑制!超过3次! =((在修复之前我使用了 unique_lock
      • 您能否提供使用共享资源的代码示例?还要检查这个home.roadrunner.com/~hinnant/mutexes/locking.html#Shared。也许会有用。
      • 尽量避免使用递归锁定,可能是通过将保护移到外部范围。递归互斥锁可能比简单的互斥锁要慢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多