Daniel Spangenberg said:
> Hello, Boosters!
>
> Today I stumbled across an unspecified behaviour which can be caused by
> the example class "counter" of the Boost thread FAQ.
> The errounous lines are inside the copy assignment operator of the
> class:
>
>       boost::mutex::scoped_lock lock1(&m_mutex < &other.m_mutex ?
> m_mutex : other.m_mutex);
>       boost::mutex::scoped_lock lock2(&m_mutex > &other.m_mutex ?
> m_mutex : other.m_mutex);
>
> Reasoning: Both the m_mutex member of *this as well as the m_mutex
> member of the argument
> other are not elements of the same object, so according to 5.9/p.2:
> "[..] the results
> of p<q, p>q, p<=q, and p>=q are unspecified.".
> On the first sight this does not mean so much for the first line (We
> just don't know, which one of the
> mutexes is chosen), but it can result in an errounous program combined
> with the same unspecified
> behaviour of the 2nd line. A valid implementation could in both cases
> return true (or false) and thus
> could lead to two successive trials to lock the same mutex, which would
> lead to an lock exception.

You're correct, and the solution is simply to replace the < operator with
std::less calls.

-- 
William E. Kempf


_______________________________________________
Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost

Reply via email to