|
|
Boost.Threadscall_once |
Introduction
Header
Synopsis
Members
Example
The call_once routine and once_flag type
can be used to run a routine exactly once. This can be used to
initialize data in a
thread-safe manner.
#include <boost/thread/once.hpp>
namespace boost {
typedef [implementation defined] once_flag;
const once_flag once_init = [implementation defined];
void call_once(void (*func)(), once_flag& flag);
} // namespace boost
This implementation defined type is used as a flag to insure a
routine is called only once. Instances of this type should be
statically initialized to once_init.
This is a constant value used to initialize once_flag
instances to indicate that the logically associated routine has not
been run yet.
void call_once(void (*func)(), once_flag& flag);
Requires: The function func shall not throw
exceptions.
Effects: As if (in an atomic fashion)
if (flag == once_init)
func();
Postcondition: flag !=
once_init
#include <boost/thread/thread.hpp>
#include <boost/thread/once.hpp>
#include <cassert>
int value=0;
boost::once_flag once = boost::once_init;
void init()
{
++value;
}
void thread_proc()
{
boost::call_once(&init, once);
}
int main(int argc, char* argv[])
{
boost::thread_group threads;
for (int i=0; i<5; ++i)
threads.create_thread(&thread_proc);
threads.join_all();
assert(value == 1);
}
Revised 05 November, 2001
© Copyright William E. Kempf 2001 all rights reserved.