C++11线程指南(二)--Lambda线程实现

1. Thread with lambda function

基于前一章中的Lambda程序,我们进行了扩展,当前创建5个线程。

#include<iostream>
#include<thread>
#include<vector>
#include<algorithm>

int main()
{
	std::vector<std::thread> threadVec;
	for(int i=0; i<5; ++i){
		threadVec.push_back(std::thread([]()
		{
			std::cout<<"thread function\n";
		}));
	}
	std::cout<<"main thread\n";

	std::for_each(threadVec.begin(), threadVec.end(), [](std::thread & thr)
	{
		thr.join();
	});
	return 0;
}

运行结果为:

thread function

thread function

thread function

main thread

thread function

thread function

2. 并发程序的特性

上述运行结果中,无法确定是哪个线程打印出了哪个结果。所以下面程序中插入一个标记。

	for(int i=0; i<5; ++i){
		threadVec.push_back(std::thread([i]()
		{
			std::cout<<"thread function "<<i <<"\n";
		}));
	}
	std::cout<<"main thread\n";

得到的结果是:

thread function 0

thread function 3

main thread

thread function 2

thread function 1

thread function 4

或者

thread function 0

thread function 1

thread function main thread

3

thread function 4

thread function 2

从中可以看到,多线程并发有着天然的不确定性。每次运行都可以得到不同的结果。调度器可以在任意的时间被中断。

C++11线程指南(二)--Lambda线程实现,布布扣,bubuko.com

时间: 2024-10-10 14:25:48

C++11线程指南(二)--Lambda线程实现的相关文章

C#中的线程(二)线程同步

C#中的线程(二)线程同步 Keywords:C# 线程Source:http://www.albahari.com/threading/Author: Joe AlbahariTranslator: Swanky WuPublished: http://www.cnblogs.com/txw1958/Download:http://www.albahari.info/threading/threading.pdf 第二部分:线程同步基础 同步要领 下面的表格列展了.NET对协调或同步线程动作的

pThread线程(二) 线程同步--互斥量/锁

互斥量(Mutex)是“mutual exclusion”的缩写.互斥量是实现线程同步,和保护同时写共享数据的主要方法. 互斥量对共享数据的保护就像一把锁.在Pthreads中,任何时候仅有一个线程可以锁定互斥量,因此,当多个线程尝试去锁定该互斥量时仅有一个会成功.直到锁定互斥量的线程解锁互斥量后,其他线程才可以去锁定互斥量.线程必须轮着访问受保护数据. 一个拥有互斥量的线程经常用于更新全局变量.确保了多个线程更新同样的变量以安全的方式运行,最终的结果和一个线程处理的结果是相同的.这个更新的变量

java 线程 (二) 线程池

package cn.sasa.demo2; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class Test { public static void main(String[] args) { /** * 线程状态 * Thread.State * * NEW * 至今尚未启动 new ...() * * RUNNABLE * 正在执行 start() *

QT线程(二)---线程同步

线程互斥 多线程运行时,通常会访问同一个变量,同一个数据结构,或者同一段代码.因此,需要使用互斥技术来保护上述资源,确保多线程执行的正确性. 注: 我们通常说某个函数是线程安全的,也就是因为该函数实现加入了线程互斥保护. 4.1.QMutex QMutex ( RecursionMode mode = NonRecursive ) ~QMutex () void lock () mutex加锁,如果当前其他线程已对该mutex加锁了,则该调用被阻塞直到其他线程释放该mutex. bool try

【线程系列二】线程的五种状态

线程有5种状态,分别是新建.受阻塞.运行.死亡.休眠.等待. 在api中的解释如下图1所示 图1 图2 解释一下上述图2的过程. 1.new一个线程对象,该对象的状态为"新建状态". 2.执行start(),如果cpu现在空闲,则切换到运行状态,否则切换到阻塞状态. 3.线程执行sleep(),切换到休眠状态,在休眠时间到期后,自动切换到(运行或阻塞) 4.执行wait(),切换到等待状态,如果不执行notifiy(),则一直处于等待状态. 5.在线程中的run()执行完毕后,线程切换

【转】C++11 并发指南五(std::condition_variable 详解)

http://www.cnblogs.com/haippy/p/3252041.html 前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mutex,std::future 等相关内容,相信读者对 C++11 中的多线程编程有了一个最基本的认识,本文将介绍 C++11 标准中 <condition_variable> 头文件里面的类和相关函数. &l

C++11 并发指南三(std::mutex 详解)

C++11 并发指南三(std::mutex 详解) 上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::thread 的一些用法,并给出了两个小例子,本文将介绍 std::mutex 的用法. Mutex 又称互斥量,C++ 11中与 Mutex 相关的类(包括锁类型)和函数都声明在 <mutex> 头文件中,所以如果你需要使用 std::mutex,就必须包含 <mutex> 头文件. <mutex> 头文件介绍 Mu

C++11 并发指南系列(转)

本系列文章主要介绍 C++11 并发编程,计划分为 9 章介绍 C++11 的并发和多线程编程,分别如下: C++11 并发指南一(C++11 多线程初探)(本章计划 1-2 篇,已完成 1 篇) C++11 并发指南二(std::thread 详解)(本章计划 1-2 篇,已完成 1 篇) C++11 并发指南三(std::mutex 详解)(本章计划 1-2 篇,已完成 2 篇) C++11 并发指南三(std::mutex 详解) C++11 并发指南三(Lock 详解) C++11 并发

iOS多线程编程指南(二)线程管理

当应用程序生成一个新的线程的时候,该线程变成应用程序进程空间内的一个实体.每个线程都拥有它自己的执行堆栈,由内核调度独立的运行时间片.一个线程可以和其他线程或其他进程通信,执行I/O操作,甚至执行任何你想要它完成的任务.因为它们处于相同的进程空间,所以一个独立应用程序里面的所有线程共享相同的虚拟内存空间,并且具有和进程相同的访问权限. 一.线程成本 多线程会占用你应用程序(和系统的)的内存使用和性能方面的资源.每个线程都需要分配一定的内核内存和应用程序内存空间的内存.管理你的线程和协调其调度所需