void call_once(void (*func)(), once_flag& flag);
当有线程执行该函数的时候,其他的线程运行到该函数,会一直等待,直到该函数被完全执行,执行完成之后flag的值会被修改,一般只是修改一次,接下来的Thrift将会使用到。
例子1)绑定函数
#include <boost/thread/thread.hpp>
#include <boost/thread/once.hpp>
#include <iostream>
int i = 0;
int j = 0;
boost::once_flag flag = BOOST_ONCE_INIT;
void Init()
{
++i;
}
void ThreadFunc()
{
boost::call_once(&Init, flag);
++j;
}
int main()
{
boost::thread thrd1(&ThreadFunc);
boost::thread thrd2(&ThreadFunc);
thrd1.join();
thrd2.join();
std::cout<<i<<std::endl;
std::cout<<j<<std::endl;
return 0;
}
g++ test.cpp -lboost_thread
结果显示,全局变量i仅被执行了一次++操作,而变量j则在两个线程中均执行了++操作
例子2)绑定类成员函数
#include <boost/function.hpp>
#include <boost/bind.hpp>
#include <boost/thread/once.hpp>
#include <iostream>
using namespace std;
boost::once_flag flag = BOOST_ONCE_INIT;
class TestA
{
public:
void method()
{
cout<<"TestA: method: no arguments"<<endl;
boost::call_once(boost::bind(&TestA::test, this), flag);
}
void method(int a, int b)
{
cout<<"TestA: method: with arguments"
<<"value of a is:"<<a
<<"value of b is "<<b <<endl;
}
void test()
{
}
};
void sum(int a, int b)
{
int sum = a + b;
cout<<"sum: "<<sum<<endl;
}
int main()
{
boost::function<void()> f;
TestA test;
f = boost::bind(&TestA::method, &test);
f();
f = boost::bind(&TestA::method, &test, 1, 2);
f();
f = boost::bind(&sum, 1, 2);
f();
}
编译指令,指定Boost库的位置,采用源码编译的Boost_1.66版本
g++ test.cpp -I/opt/cmms/3thrdparty/boost/include -L/opt/cmms/3thrdparty/boost/lib -lboost_thread -Wl,-rpath=/opt/cmms/3thrdparty/boost/lib
注意:
目前测试的版本是Boost_1.66版本,CentOS7.18版本中的Boost_1.53,编译会出现如下的错误:
test.cpp:15:58: error: no matching function for call to ‘call_once(boost::_bi::bind_t<void, boost::_mfi::mf0<void, TestA>, boost::_bi::list1<boost::_bi::value<TestA*> > >, boost::once_flag&)’
boost::call_once(boost::bind(&TestA::test, this), flag);
中文错误:
test.cpp:15:58: 错误:对‘call_once(boost::_bi::bind_t<void, boost::_mfi::mf0<void, TestA>, boost::_bi::list1<boost::_bi::value<TestA*> > >, boost::once_flag&)’的调用没有匹配的函数
查看1.66版本代码:boost/thread/once.hpp
namespace boost
{
// template<class Callable, class ...Args> void
// call_once(once_flag& flag, Callable&& func, Args&&... args);
template<typename Function>
inline void call_once(Function func,once_flag& flag)
//inline void call_once(void (*func)(),once_flag& flag)
{
call_once(flag,func);
}
}
查看1.53版本代码:boost/thread/once.hpp
namespace boost
{
// template<class Callable, class ...Args> void
// call_once(once_flag& flag, Callable&& func, Args&&... args);
inline void call_once(void (*func)(),once_flag& flag)
{
call_once(flag,func);
}
}
两者之间的区别在于最新版本使用的是模板类型,支持类成员函数作为参数进行传递