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

++ 0x 标准将增加对多线程的支持。以后所有的编译器都必须遵循新标准中对多线程的规定,这将会给不同平台上程序的移植带来很大的方便。

让我们先来看看std::thread类,它负责管理线程的执行过程。

启动线程

我们创建一个std::thread类的实例来启动一个新线程,用一个线程函数作为构造函数的参数。如

void do_work();
std::thread t(do_work);

std::thread类也接受一个函数对象作为参数。

class do_work
{
public:
void operator()();
};

do_work dw;
std::thread t(dw);

注意这里只是传了一个对象的拷贝进去。如果想传递对象本身(你应该确保在线程结束前它没有被销毁),可以使用std::ref。

do_work dw;
std::thread t(std::ref(dw));

很多创建线程的API允许传递一个参数给线程,例如long或void*。Std::thread也支持参数,并且可以是任意类型任意个数的参数。

void do_more_work(int i,std::string s,std::vector<double> v);
std::thread
t(do_more_work,42,"hello",std::vector<double>(23,3.141));

也可以用std::ref传引用。

void foo(std::string&);
std::string s;
std::thread t(foo,std::ref(s));

知道了怎么启动线程,那我们如何等待线程结束呢?新标准中有个术语叫joining来表示与线程协同工作, 我们使用成员函数join()

void do_work();
std::thread t(do_work);
t.join();

如果你不想joining你的线程,可以销毁线程对象或者调用detach()。

void do_work();
std::thread t(do_work);
t.detach();

启动线程就这么简单。接下来我会介绍一下线程间如何共享数据。

时间: 2024-10-03 08:06:56

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

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

在初始化时保护数据 如果你的数据需要在初始化时被保护,就不能再使用mutex了.因为在初始化结束后,这会引起不必要的同步.C++0x提供了很多方法来在初始化时保护数据. 1)假定你的构造函数是用constexpr关键字声明并且满足常量初始化的条件.在这种情况下,一个静态存储区的对象在静态初始阶段会确保在其他代码运行之前被初始化.对于std::mutex来说,这是最佳选择,因为它消除了全局mutex初始化时产生紊乱的可能性. class my_class { int i; public: cons

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