<b>C++0x概览:多线程(3)</b>[VC/C++编程]
本文“<b>C++0x概览:多线程(3)</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
在初始化时保护数据
假如你的数据需求在初始化时被保护,就不能再利用mutex了.因为在初始化完毕后,这会惹起不必要的同步.C++0x供应了很多办法来在初始化时保护数据.
1)假定你的构造函数是用constexpr关键字声明并且满意常量初始化的条件.在这种情形下,一个静态存储区的对象在静态初始阶段会确保在其他代码运行之前被初始化.关于std::mutex来说,这是最佳挑选,因为它消除了全局mutex初始化时产生混乱的大概性.
class my_class
{
int i;
public:
constexpr my_class():i(0){}
my_class(int i_):i(i_){}
void do_stuff();
};
my_class x; // static initialization with constexpr constructor
int foo();
my_class y(42+foo()); // dynamic initialization
void f()
{
y.do_stuff(); // is y initialized?
}
2)在一个块作用域(block scope)中利用静态变量.在C++0x中,块作用域的静态变量在函数第一次被调用时初始化.假如另一个线程在初始化完成之前试图调用该函数,它必须等候.
void bar()
{
static my_class z(42+foo()); // initialization is thread-safe
z.do_stuff();
}
3)假如以上情形都不实用(对象大概是动态成立),那么最好利用std::call_once和std::once_flag.从名字便可以看出,std::call_once用于与一个std::once_flag实例合作,指定的函数将只会履行一次.
my_class* p=0;
std::once_flag p_flag;
void create_instance()
{
p=new my_class(42+foo());
}
void baz()
{
std::call_once(p_flag,create_instance);
p->do_stuff();
}
同std::thread构造函数一样,std::call_once也可以承受函数对象作为参数,并且承受多个参数.再次夸大,默许是传拷贝.假如要传引用,请利用std::ref.
以上是“<b>C++0x概览:多线程(3)</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |