Boost logo

Boost :

Subject: Re: [boost] [thread] synchronized_value: value and move semantics
From: Vicente J. Botet Escriba (vicente.botet_at_[hidden])
Date: 2013-06-26 13:05:14


Le 26/06/13 18:03, Vicente Botet a écrit :
> Ben Pope wrote
>> On 21/02/13 02:02, Vicente J. Botet Escriba wrote:
>>> Hi,
>>>
>>> boost::synchronized_value (not released yet [1][2][3]) is based on [4].
>>> See below part of this paper adapted to the Boost.Thread interface.
>>>
>>> Currently boost::synchronized_value is in addition Copyable and
>>> Swappable. I was wondering if it is worth adding value and move
>>> semantics to synchronized_value. Making it EqualityComparable,
>>> LessThanComparable and Movable if the underlying type satisfy these
>>> requirements will allow to store them on a Boost.Container/C++11
>>> container.
>>>
>>> Do you see something completely wrong with this addition?
>>> Has some of you had a need for this? Could you share the context?
>> Sorry, I'm a bit late to the party and not really answering the question.
>>
>> I can see the usefulness of synchronized_value for C++03, but not in
>> C++11.
> Why?
>
>
>> It's just too easy to forget to call the synchronise() member:
>>
>> boost::synchronized_value<std::queue<int>> synch_queue;
>> if(!synch_queue->empty())
>> synch_queue->pop();
>>
>> when was was meant was (excuse use of auto, I've become lazy):
>>
>> boost::synchronized_value<std::queue<int>> synch_queue;
>> {
>> auto lock = synch_queue.synchronize();
>> if(!synch_queue->empty())
>> synch_queue->pop();
>> }
>>
>> This is neither safe or efficient (2 lock/unlocks).
> this should be
>
> boost::synchronized_value<std::queue<int>> synch_queue;
> {
> auto lock = synch_queue.synchronize();
> if(!lock->empty())
> lock->pop();
> }
>
>
>> I think this should just not exist in C++11 and instead be replaced by
>> something like monitor
>> <T>
>> described by Herb Sutter [1]:
>>
>> monitor&lt;std::queue&lt;int&gt;> synch_queue;
>> queue([](std::queue& q)
>> {
>> if(!q.empty())
>> q.pop();
>> }
> Sorry I don't understand the syntax.
>
After looking at the slides I understand now what it means.
I guess you meant

sync_queue([](std::queue& q)

{
     if(!q.empty())
         q.pop();
}
);

I like execute around a function locking pattern, and yes without
lambdas this pattern is not practical, so no portable to C++03.
Adding the function to synchronized_value would not be too hard.

Best,
Vicente


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