当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:54:00  来源:本站整理

<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++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:

  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

    文章评论评论内容只代表网友观点,与本站立场无关!

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .