C++0x概览:多线程(3)

在初始化时保护数据

如果你的数据需要在初始化时被保护,就不能再使用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.

时间: 2024-10-26 04:19:03

C++0x概览:多线程(3)的相关文章

C++0x概览:多线程(1)

++ 0x 标准将增加对多线程的支持.以后所有的编译器都必须遵循新标准中对多线程的规定,这将会给不同平台上程序的移植带来很大的方便. 让我们先来看看std::thread类,它负责管理线程的执行过程. 启动线程 我们创建一个std::thread类的实例来启动一个新线程,用一个线程函数作为构造函数的参数.如 void do_work(); std::thread t(do_work); std::thread类也接受一个函数对象作为参数. class do_work { public: void

C++0x概览:多线程(2)

数据保护 同许多线程API一样,C++0x用互斥来保护共享数据.有四种互斥类型: Non-recursive (std::mutex) Recursive (std::recursive_mutex) 允许锁超时的non-recursive (std::timed_mutex) 允许锁超时的recursive (std::recursive_timed_mutex) 如果你试图在一个线程上锁(lock)一个non-recursive mutex两次而当中没有unlock它的话,会产生未知结果.递

线程基础之JAVA和C++0x的特性

译文连接   译文地址  译者:衣着时   校对:丁一    (有兴趣参与试译或校对的同学,请加入并发网试译者QQ群:369468545) JAVA特性 JAVA线程通常是一个带有run()方法的java.lang.Thread的子类,然后调用这个子类对象的start()方法.我们之前定义过,数据竞争是因为两个线程同时访问内存单元,在JAVA中,内存单元是一个对象字段或数组元素. 由于JAVA旨在支持运行不受信任代码作为受信任的应用程序的一部分,必须限制不受信任代码的数据争用造成的破坏.因此不允

Optimizeit Thread Debugger概览

debug Optimizeit Thread Debugger概览本文通过介绍Optimizeit Thread Debugger的一些主要特征来使你对它有个简要的了解.如果想要了解更多的信息,请查看Optimizeit Thread Debugger用户手册,也可以从Optimizeit Thread Debugger单击主菜单info|help来查看所有的使用文档.使用中有何问题,请随时与Borland Technical Support联系.测试java程序Optimizeit Thre

iphone中如何进行多线程编程

  多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然源于c,但其多线程编程却相当简单,可以与java相媲美.这篇文章主要从线程创建与启动.线程的同步与锁.线程的交互.线程池等等四个方面简单的讲解一下iphone中的多线程编程. 一.线程创建与启动 线程创建主要有二种方式: - (id)init; // designated initializer - (id)initWithTarget:(id)target selector:(SEL)selector ob

iOS开发系列—Objective-C之基础概览

概览 前面我们已经用了几章内容进行C语言介绍,当然要通过几篇文章完整的介绍C语言的知识是不太现实的,例如C语言的文件操作.内存申请等我们都没有重点介绍,当然核心知识点基本都已经提到了,后面有时间我们会继续扩充.今天我们正式开始学习Objective-C,以后简称"ObjC",ObjC是在C语言的基础上加上了一层面向对象的特性,它完全兼容C语言,甚至可以混写C++.它是Mac OS X和IOS的主要开发语言,从IOS发布之后可以说ObjC的地位呈直线上升趋势,当前ObjC已经是仅次于C语

关于Linux下的多线程

一.线程的创建 头文件 #include <pthread.h> 函数声明 int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 在一个线程中调用pthread_create函数创建新的线程后,当前线程从pthread_create处继续往下执行,start_routine为新创建线程的入口函数,start_routine函数接

Java 性能调优指南之 Java 集合概览

[编者按]本文作者为拥有十年金融软件开发经验的 Mikhail Vorontsov,文章主要概览了所有标准 Java 集合类型.文章系国内 ITOM 管理平台 OneAPM 编译呈现,以下为正文: 本文将概览所有标准的 Java 集合类型.我们将按照它们可区分的属性与主要用例进行分类.除此之外,我们还将穷举在不同集合类型之间进行数据转换的方法. 数组(Arrays) 数组是 Java 语言内置的唯一集合类型,尤其擅长处理预先知道数量上限的元素集.java.util.Arrays 包含了许多用于处

《Spark官方文档》集群模式概览

Spark 1.6.0  译者:dlbrant 集群模式概览 本文简要描述了Spark在集群中各个组件如何运行.想了解如何在集群中启动Spark应用,请参考application submission guide . 组件 Spark应用在集群上运行时,包括了多个独立的进程,这些进程之间通过你的主程序(也叫作驱动器,即:driver)中的SparkContext对象来进行协调. 特别要指出的是,SparkContext能与多种集群管理器通信(包括:Spark独立部署时自带的集群管理器,Mesos