Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost::mutex作为类的私有成员_C++_Multithreading_Boost_Boost Thread_Boost Mutex - Fatal编程技术网

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

C++ 使用boost::mutex作为类的私有成员,c++,multithreading,boost,boost-thread,boost-mutex,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

我有一个类,它包含一个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;
  }
};
class-StringDeque
{
boost::互斥mtx;
std::deque string_deque;
公众:
StringDeque(){}
void addToDeque(常量字符串和str_to_add)
{
增压:锁紧保护装置(mtx);
字符串数据推送(str-to-add);
}
字符串popFromDeque()
{
增压:锁紧保护装置(mtx);
string popped_string=string_deque.front();
string_deque.pop();
返回弹出的字符串;
}
};
这个类并不意味着特别有用,但我只是在玩互斥体和线程

我有一个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();
}
void打印字符串(字符串和字符串)
{
int i=0;
而(i<10)
{
字符串popped_string=str_deque.popFromDeque();
if(弹出的字符串.empty())
{
睡眠(1);
继续;
}

您的问题是,
boost::thread
按值获取其参数。要强制它按引用获取参数,您需要将内容修改为:

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

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

使您的类不可复制。
delete
copy构造函数和赋值运算符。不要复述编译器消息,复制并粘贴它们,包括它们的行号。指出有问题的lin在tge源代码中定义你自己的复制构造函数,在这里你不复制互斥。我使用的是一个古老的编译器,它只以实验形式支持C++11。