欢迎光临散文网 会员登陆 & 注册

线程

2023-07-01 15:58 作者:追逐彗星的尾巴  | 我要投稿

std::thread类的构造

std::thread可以用可调用类型(Callable)构造。

Case 0 : 函数

Case 1 : 函数指针(Function Pointers)

Case 2 : lambda

Case 3 : 函数对象 (Function Objects)/ 仿函数(Functors)

分离线程(detaching)

使用detach()会让线程在后台运行,意味着主线程不能与之产生直接交互。也就是说,不会等待这个线程结束。

试想如何能让一个文字处理应用同时编辑多个文档。一种处理方式是,让每个文档处理窗口拥有自己的线程,打开一个文档就启动一个新线程;每个线程运行同样的的代码,并隔离不同窗口处理的数据。因为是对独立的文档进行操作,所以没有必要等待其他线程完成。因此,可以让文档处理窗口运行在分离的线程上。

使用分离线程处理多个文档

线程所有权的转移

线程对象代表一个执行线程的实体,它通常与一个可调用对象相关联。移动线程对象并不会移动正在执行的线程本身,它只是移动线程对象所拥有的底层资源。移动线程对象后,原始线程对象将不再拥有与之关联的线程资源。


首先,func与t1相关联。当显式使用std::move()创建t2后,t1的所有权就转移给
了t2。之后,t1和func就没有关联了。

下面定义了一个scoped_thread类,它可以确保线程在程序退出前完成。

创建一组线程

有时候一个工作可以拆分成若干个小任务,每一个任务都由一个线程去做。这就需要创建一组线程,线程的数量应该在运行时确定。下面实现了一个并行版的std::accumulate,可以在多线程环境下加快累加的速度。

函数paraller_accumulate首先计算出需要启动的线程数量,然后将整个区间分成若干个块,每个块分配一个线程进行累加,最后将每个块的结果累加得到最终的结果。

线程的评论 (共 条)

分享到微博请遵守国家法律