|
Boost Users : |
From: Daryl Haresign (mail_at_[hidden])
Date: 2008-09-01 10:30:37
I've been trying to use boost::thread with a movable structure (see end
for code + error). From the online manual (
http://www.boost.org/doc/libs/1_36_0/doc/html/thread/thread_management.html#thread.thread_management.thread.multiple_argument_constructor
)
template <class F, class A1, class A2, ...>
thread(F f, A1 a1, A2 a2, ...);
Preconditions:
F and each An must by copyable or movable.
Effects:
As if thread(boost::bind(f,a1,a2,...)). Consequently, f and
each an are copied into internal storage for access by the new thread.
I've been running into a problem with this however. The use of
boost::bind means that F needs to have a copy constructor, which seems
odd as the manual says "or movable".
Am I doing something wrong, or is this an oversight, or what?
Regards,
Daryl.
----------
Code:
(built with: gcc version 4.4.0 20080831 (experimental) (GCC)
g++-trunk -o move_thread move_thread.cpp --std=c++0x
/usr/local/lib/libboost_thread-gcc43-mt.a)
----------
#include <iostream>
#include <vector>
#include <boost/preprocessor/iteration/iterate.hpp>
#include <boost/thread.hpp>
using std::cout;
using std::endl;
using std::vector;
using boost::thread;
struct S
{
S(int) { cout << "S()" << endl; }
S(S &&) { cout << "S() move" << endl; }
void operator()(int i) { cout << "Thread running [" << i << "]" << endl; }
S(S const &) = delete;
};
int main()
{
vector<thread> v;
for (int i = 0; i < 10; ++i)
{
v.push_back(thread(S(i), i));
}
for (int i = 0; i < 10; ++i)
{
v[i].join();
}
}
----------
Error:
----------
In file included from /usr/local/include/boost/thread/thread.hpp:22,
from /usr/local/include/boost/thread.hpp:13,
from move_thread.cpp:4:
move_thread.cpp: In constructor boost::thread::thread(F, A1) [with F =
S, A1 = int]:
move_thread.cpp:26: instantiated from here
move_thread.cpp:18: error: deleted function S::S(const S&)
/usr/local/include/boost/thread/detail/thread.hpp:227: error: used here
/usr/local/include/boost/thread/detail/thread.hpp:227: error:
initializing argument 2 of boost::_bi::bind_t<R, F, typename
boost::_bi::list_av_1<A1>::type> boost::bind(boost::type<R>, F, A1)
[with R = void, F = S, A1 = int]
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net