$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Roland Schwarz (roland.schwarz_at_[hidden])
Date: 2006-10-04 13:03:50
Felipe Magno de Almeida wrote:
> The problem is that it isnt possible when a ptr must be used in a free
> template function and the pointer is parameterized on the template
> function parameters. That was the spirit case. There isnt any solution
> from the boost.thread for this. Which, IMO, it leads to believe that
> thread_specific_ptr is the solution. After all, it is the only public
> solution for tss in boost.thread.
I did a liitle further research on the problem.
In the function
void foo()
{
static testclass bar;
}
the constructor call must be somehow conditioned on
a variable (which normally is invisible to user code
and automaticall compiler generated).
This variable _is_ a shared resource and as such _must_
be protected!
So if we had a statically initializeable mutex, we would
say:
void foo()
{
static mutex mtx = STATIC_MUTEX_INITIALIZER;
scoped_lock lk(mtx);
static testclass bar;
lk.unlock();
}
Since there is no static_mutex in the boost thread lib yet,
one might use either boost/regex/pending/static_mutex.hpp
or the following, which only uses boost::thread :
namespace {
void dont_clean(boost::mutex**) {
};
boost::thread_specific_ptr<boost::mutex*> mutex_ptr(dont_clean);
void mutex_init()
{
boost::mutex* pm = new boost::mutex;
*(mutex_ptr.get()) = pm;
}
}
void foo()
{
static boost::mutex* bar_mutex = 0;
static boost::once_flag bar_once = BOOST_ONCE_INIT;
mutex_ptr.reset(&bar_mutex);
boost::call_once(&mutex_init, bar_once);
boost::mutex::scoped_lock bar_lock(*bar_mutex);
static testclass bar;
bar_lock.unlock();
.... other code
}
There is a trade of currently between the both solutions:
When the regex solution falls back to boost::thread based
implementation there is only one global mutex beeing used
for all objects of static_mutex. This is not the case with
my solution. However mine leaves back a small memory leak
for each.
I definitely think boost thread should provide a static
initializeable mutex, and this already is on the todo list.
Altough the cleanup first has to be fixed.
After all I think, spirit should implement one of the
above in grammar.ipp, since both fix the outstanding bug.
Roland