使用boost :: mutex作为类的私有成员

时间:2016-11-08 09:13:41

标签: c++ multithreading boost boost-thread boost-mutex

我有一个包含boost :: mutex作为私有成员的类。当您调用其中一个公共函数时它会被锁定,并在函数退出时解锁。这是为了提供对对象内部的同步访问。

class StringDeque
{
  boost::mutex mtx;
  std::deque<string> string_deque;
public:
  StringDeque() { }

  void addToDeque(const string& str_to_add)
  {
    boost::lock_guard<boost::mutex> guard(mtx);
    string_deque.push(str_to_add);
  }

  string popFromDeque()
  {
    boost::lock_guard<boost::mutex> guard(mtx);
    string popped_string = string_deque.front();
    string_deque.pop();
    return popped_string;
  }
};

这个类并不是特别有用,但我只是在玩互斥体和线程。

我有一个main(),它还有另一个定义的函数,它从类中弹出字符串并在线程中打印它们。它会重复这10次,然后从函数返回。再一次,这纯粹是出于测试目的。它看起来像这样:

void printTheStrings(StringDeque& str_deque)
{
    int i = 0;
    while(i < 10)
    {
      string popped_string = str_deque.popFromDeque();
      if(popped_string.empty())
      {
        sleep(1);
        continue;
      }
      cout << popped_string << endl;
      ++i;
    }
}

int main()
{
  StringDeque str_deque;
  boost::thread the_thread(printTheStrings, str_deque);
  str_deque.addToDeque("Say your prayers");
  str_deque.addToDeque("Little One");
  str_deque.addToDeque("And Don't forget My Son");
  str_deque.addToDeque("To include everyone");
  str_deque.addToDeque("I tuck you in");
  str_deque.addToDeque("Warm within");
  str_deque.addToDeque("Keep you free from sin");
  str_deque.addToDeque("Until the sandman he comes");
  str_deque.addToDeque("Sleep with one eye open");
  str_deque.addToDeque("Gripping your pillow tight");
  the_thread.join();
}

我不断得到的错误是boost :: mutex是不可复制的。 printTheStrings()函数需要一个引用,所以我有点困惑为什么这是试图复制对象。

我已经阅读了一些内容,我继续阅读的一个解决方案是使boost :: mutex成为对象的静态私有成员。但是,这会破坏我的互斥锁的目的,因为我希望它是逐个对象而不是类变量。

这只是对互斥锁的错误使用吗?我应该重新考虑整个申请吗?

编辑:

我刚发现condition_variable应该更好地服务于我的目的,让线程等到deque中实际存在某些东西然后从deque中弹出并打印出来之前。我看到的所有示例都在全局范围内定义了这些互斥锁和condition_variable对象。在我看来,这看起来非常......不是面向对象的。即使是直接来自Boost的例子也表明它是以这种方式完成的。这真的是其他人如何使用这些物品吗?

1 个答案:

答案 0 :(得分:2)

{J} printToString引用StringQueue是正确的。你的问题是boost::thread通过值来获取它的参数。要强制它通过引用获取参数,您需要修改以下内容:

boost::thread the_thread(printTheStrings, boost::ref(str_deque));

另外,从C ++ 11开始,线程是标准库的一部分。您应该使用std::thread instead