Boost logo

Boost :

Subject: Re: [boost] [Thread] Non-copyable boost::thread
From: Anthony Williams (anthony.ajw_at_[hidden])
Date: 2010-05-17 16:54:06


"Belcourt, Kenneth" <kbelco_at_[hidden]> writes:

> On May 17, 2010, at 9:49 AM, vicente.botet wrote:
>
>> ----- Original Message -----
>> From: "Belcourt, Kenneth" <kbelco_at_[hidden]>
>> To: <boost_at_[hidden]>
>> Sent: Monday, May 17, 2010 5:41 PM
>> Subject: Re: [boost] [Boost][Thread] Non-copyable boost::thread
>>
>> On May 17, 2010, at 2:25 AM, Anthony Williams wrote:
>>>
>>>> "Belcourt, Kenneth" <kbelco_at_[hidden]> writes:
>>>>
>>>>> Intel-11.1 on Darwin is a recent compiler that will not compile
>>>>> this
>>>>> code.
>>>>>
>>>>> [ from libs/thread/test/test_thread_return_local.cpp ]
>>>>>
>>>>> boost::thread make_thread_return_local(boost::thread::id* the_id)
>>>>> {
>>>>> boost::thread t(do_nothing,the_id);
>>>>> return t;
>>>>> }
>>>>>
>>>>>
>>>>> Any ideas how to work around this failure?
>>>>
>>>> Explicitly move the return value:
>>>>
>>>> return std::move(t);
>>>>
>>>> or even
>>>>
>>>> return std::thread(std::move(t));
>>>
>>> Yup, that's what I figured. But this compiler doesn't have
>>> std::move().
>>>
>>> Any other ideas on how to get these Darwin / Intel tests running
>>> Anthony? Would the Boost.Move library currently under review work
>>> here?
>>
>> If you are using Boost.Thread as I suspect, try
>> return boost::move(t);
>> or even
>> return boost::thread(boost::move(t));
>
> I'd considered this already but I'm not sure how to implement the move
> copy and assign constructors for Boost.Thread that Boost.Move
> requires.

Vicente is right that I meant boost::move and boost::thread.

boost::move is overloaded for boost::thread and anything else that uses
boost::thread_move, so the above should "just work".

See libs/thread/test/test_thread_move.cpp and
libs/thread/test/test_thread_move_return.cpp

> Since Boost.Thread has it's own partial move implementation in
> boost::detail::thread_move, it seems that some work is necessary to
> integrate (or re-implement) thread_move in terms of boost::move.
> That's why I thought I'd ping Anthony and see if this is even worth
> considering.

Yes, there's a bit of work necessary to integrate Boost.Thread move
support and Boost.Move, but it should still support move semantics
through its own mechanism in the mean time.

As far as the specific test goes --- it's a characterisation test that
identifies whether or not the platform/compiler supports the particular
scenario. Some do, some don't. I think technically the ones that don't
are more conforming under C++98, but it's a useful extension in this
case. Under C++0x, with rvalue-ref move support, it is required to work.

Anthony

-- 
Author of C++ Concurrency in Action     http://www.stdthread.co.uk/book/
just::thread C++0x thread library             http://www.stdthread.co.uk
Just Software Solutions Ltd       http://www.justsoftwaresolutions.co.uk
15 Carrallack Mews, St Just, Cornwall, TR19 7UL, UK. Company No. 5478976

Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk