Subject: [Boost-bugs] [Boost C++ Libraries] #3407: boost::call_once not re-entrant (at least in win32)
From: Boost C++ Libraries (noreply_at_[hidden])
Date: 2009-09-06 03:07:02
#3407: boost::call_once not re-entrant (at least in win32)
-----------------------------------------------+----------------------------
Reporter: Vincent Falco <thevinn@â¦> | Owner: anthonyw
Type: Bugs | Status: new
Milestone: Boost 1.41.0 | Component: threads
Version: Boost 1.40.0 | Severity: Problem
Keywords: threads |
-----------------------------------------------+----------------------------
The win32 implementation of boost::call_once ( boost/thread/win32/once.hpp
version 1.40.0 ) is not reentrant for the same thread. The problem happens
on line 127. The function is called, and then the flag is set. This order
should be reversed, the flag should be set and then the function should be
called. If the function throws, the flag must be set back.
This program demonstrates the issue:
#include <boost/thread/once.hpp>
static boost::once_flag flag;
void called_twice()
{
boost::call_once( called_twice, flag );
// gets here twice
}
int main()
{
boost::call_once( called_twice, flag );
}
While this may seem like a contrived example, it can easily happen in
practice. Consider the case of a boost::singleton constructor that calls a
function which then accesses its 'instance' member. The result will be
that the singleton is created twice, because call_once is not re-entrant.
Also consider the case of two singletons, A and B. A calls methods on B
from its constructor, and B calls methods on A from its constructor. A
will be created twice due to the non-reentrant behavior of call_once.
I have not studied the behavior of call_once for other platforms.
-- Ticket URL: <https://svn.boost.org/trac/boost/ticket/3407> Boost C++ Libraries <http://www.boost.org/> Boost provides free peer-reviewed portable C++ source libraries.
This archive was generated by hypermail 2.1.7 : 2017-02-16 18:50:01 UTC