C++ 使用boost::mutex作为类的私有成员
我有一个类,它包含一个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
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。