10

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

2 回答 2

11

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

于 2011-08-15T15:19:34.390 回答
3

这是使用 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.

于 2011-08-15T16:01:34.637 回答