[英]Multithreading with templated class member function
So, I'm fairly new to the C++11 concurrent programming functionality provided by the STL and I was playing around with the following code: 所以,我对STL提供的C ++ 11并发编程功能还不熟悉,我正在使用以下代码:
#include <iostream>
#include <thread>
#include <mutex>
#include <list>
using namespace std;
template <typename T>
class Container
{
private:
mutex mu;
list<T> myList;
public:
void add(T element)
{
lock_guard<mutex> lock1(mu);
myList.emplace_back(element);
}
void remove()
{
lock_guard<mutex>lock2(mu);
myList.pop_back();
}
void print()
{
for(const auto & element : myList)
{
cout << element << endl;
}
}
};
int main()
{
Container<int> c;
thread t1(&Container<int>::add, c, 5); //ERROR
thread t2(&Container<int>::add, c, 10); //ERROR
thread t4(&Container<int>::remove, c); //ERROR
thread t5(&Container<int>::remove, c); //ERROR
t1.join();
t2.join();
t4.join();
t5.join();
c.print();
}
When I try to compile my code, the lines I've marked "ERROR" caused the compiler to tell me: 当我尝试编译我的代码时,我标记为“ERROR”的行导致编译器告诉我:
error: call to implicitly-deleted copy constructor of
'typename decay<Container<int> &>::type' (aka 'Container<int>')
return _VSTD::forward<_Tp>(__t);
error: no matching constructor for initialization of
'__tuple_leaf<1UL, Container<int> >'
__tuple_leaf<_Uf, _Tf>(_VSTD::forward<_Up>(__u))...,
error: no matching function for call to '__decay_copy'
__decay_copy(_VSTD::forward<_Args>(__args))...));
^~~~~~~~~~~~
Now, I've looked at this question and this question while I was writing my code, but I'm still missing some small detail. 现在,我在编写代码时已经看过这个问题和这个问题 ,但我仍然缺少一些小细节。 If someone could provide some help, that would be brilliant.
如果有人可以提供一些帮助,那就太棒了。 Thanks!
谢谢!
A thread
needs to make a copy of all of its arguments and your Container
is non copyable. thread
需要复制其所有参数,并且您的Container
不可复制。 It is non-copyable because one of its members (the std::mutex
) is non-copyable. 它是不可复制的,因为它的一个成员(
std::mutex
)是不可复制的。 The solution to this is rather than give the thread
c
directly is to give it something that it can make a copy of. 对此的解决方案不是直接给
thread
c
给它一些它可以复制的东西。
That is: 那是:
thread t1(&Container<int>::add, &c, 5);
The following should work as well, but may not (see TC's comment ): 以下应该也可以,但可能不会(参见TC的评论 ):
thread t2(&Container<int>::add, std::ref(c), 10);
Note that it's a good thing that this didn't compile for you, because otherwise your threads would be performing work on various copies of your container - rather than just the one as you likely expected. 请注意,这不能为您编译是件好事,因为否则您的线程将在容器的各个副本上执行工作 - 而不仅仅是您可能期望的那个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.