40.c++11多线程(代码片段)

干锅土鸡 干锅土鸡     2022-12-05     765

关键词:

语言级别的多线程=》代码跨平台 Windows、linux、macos
thread/mutex/condition_variable
atomic原子类型,基于CAS操作的原子类型(线程安全)
sleep_for

本质上都是在调用系统的API

一、如何创建启动线程?
std::thread定义一个线程对象,传入线程所需要的线程函数和参数,线程自动开启!

void threadHandler(int time)

	std::this_thread::sleep_for(std::chrono::seconds(time));//子线程睡眠两秒
	cout << "hello thread1!" << endl;

int main()

	//创建了一个线程对象,传入一个线程函数,新线程(函数)就开始运行了
	std::thread t1(threadHandler1,2);
	//主线程等待子线程结束,主线程继续往下运行
	t1.join();

	cout << "main thread done!" << endl;

//把子线程设置为分离线程
//主线程和子线程没关系了,子线程运行完毕与否,与主线程无关
//主线程运行完成,查看如果当前进程还有未运行完成的子线程,进程就会异常终止
t1.detach();

二、子线程如何结束?
子线程函数运行完成,线程就结束了

三、主线程如何处理子线程
join:等待某线程结束,当前线程继续往下运行
detach:把当前子线程设置为分离线程,主线程结束,整个进程结束,所有子线程都自动结束了!

竞态条件:多线程执行的结果是一致的,不会随着cpu对线程不同的调用顺序,而产生不同的运行结果。

int ticketCount=100;
void sellTicket(int index)

	while(ticketCount > 0)
	
		//cout << "窗口:" << index << "" << ticketCount << "张票!" << endl;
		cout << ticketCount << endl;
		ticketCount--;
		std::this_thread::sleep_for(std::chrono::milliseconds(100));
	

int main()

	list<std::thread> tlist;
	for(int i=1;i<=3;++i)
	
		tlist.push_back(std::thread(sellTicket,i));
	
	for(std::thread& t : tlist)
	
		t.join();
	
	cout << "所有窗口买票结束!" << endl;
	return 0;

上述程序运行可能出现多次相同的数字!为什么?

可能执行一个汇编语句,时间片就到了,去执行其他的线程语句了!
解决方法,加锁:

锁内的区域叫:临界区代码段

[多线程]c++11多线程用法整理(代码片段)

...入了<thread>头文件,此头文件主要声明了std::thread线程类。C++11的标准类std::thread对线程进行了封装,定义了C++11标准中的一些表示线程的类、用于互斥访问的类与方法等。应用C++11中的std::thread便于多... 查看详情

详解c++11多线程(代码片段)

c++的多线程可以充分利用计算机资源,提高代码运行效率。在这里总结了一些多线程应用过程中的基本概念和用法。一、进程与线程进程是资源分配和调度的一个独立单位。而线程是进程的一个实体,是CPU调度和分派的基本单位... 查看详情

c++11多线程--基本使用(代码片段)

c++11多线程–基本使用前言:这篇文章仅针对没有使用过c++11线程库的童鞋来快速入门,也是自己的一个简单记录,内容比较基础。1.线程的基本使用2.互斥量3.条件变量4.原子变量补充1.线程的基本使用代码... 查看详情

c++11多线程编程之线程类(代码片段)

...发程序时,存在诸多的不便。现在C++11中增加了线程以及线程相关的类,很方便地支持了并发编程,使得编写的多线程程序的可移植性得到了很大的提高。C++11中提供的线程类叫做std:: 查看详情

c++11中多线程例子(代码片段)

C++11开始自带线程相关的操作库。这里举个例子,以并发编程最经典的例子,生产者消费者的例子来示例在C++11使用标准库提供的线程库来进行并发编程。这里为了方便线程的使用,参考了android源码中对pth... 查看详情

[c++11多线程同步]---线程同步概述(代码片段)

1线程调度的几个基本知识点多线程并发执行时有很多同学捋不清楚调度的随机性会导致哪些问题,要知道如果访问临界资源不加锁会导致一些突发情况发生甚至死锁。关于线程调度,需要深刻了解以下几个基础知识点:调度的... 查看详情

c/c++c++11初探多线程(代码片段)

...很多参考该专栏之前在Linux下,一直使用Pthread使用多线程变成。C++11新标准中引入了五个头文件来支持多线程编程,他们分别是<atomic>, <thread>, <mutex>, < 查看详情

c++11多线程中的detach()join()joinable()(代码片段)

一.传统多线程编写:一般来说,我们在主线程中开辟出一些子线程来完成我们的任务,正常情况下,需要在主线程的最后调用join(),用于阻塞主线程,避免主线程先于其他子线程执行完毕,退出,然后导致整个进程的异常.join():阻塞主线程,... 查看详情

[c++11多线程同步]---条件变量(代码片段)

...的时候,它使用std::unique_lock(通过std::mutex)来锁住当前线程。当前线程会一直被阻塞,直到另外一个线程在相同的std::condition_variable对象上调用了notification函数来唤醒当前线程。st 查看详情

[c++11多线程同步]---条件变量(代码片段)

...的时候,它使用std::unique_lock(通过std::mutex)来锁住当前线程。当前线程会一直被阻塞,直到另外一个线程在相同的std::condition_variable对象上调用了notification函数来唤醒当前线程。st 查看详情

[多线程]c++11多线程-条件变量(std::condition_variable)(代码片段)

互斥量(std::mutex)是多线程间同时访问某一共享变量时,保证变量可被安全访问的手段。在多线程编程中,还有另一种十分常见的行为:线程同步。线程同步是指线程间需要按照预定的先后次序顺序进行的行为。C+... 查看详情

c++11线程使用(代码片段)

线程概念C++11引入了thread类,大大降低了多线程使用的复杂度,原先使用多线程只能用系统的API,无法解决跨平台问题,一套代码平台移植,对应多线程代码也必须要修改。现在在C++11中只需使用语... 查看详情

廖雪峰java11多线程编程-4线程工具类-1threadlocal(代码片段)

classUserStringname;intlevel;publicUser(Stringname,intlevel)this.name=name;this.level=level;classUserContextimplementsAutoCloseablestaticfinalThreadLocal<User>context=newThreadLocal<> 查看详情

[c++11多线程同步]---线程同步概述(代码片段)

1线程调度的几个基本知识点多线程并发执行时有很多同学捋不清楚调度的随机性会导致哪些问题,要知道如果访问临界资源不加锁会导致一些突发情况发生甚至死锁。关于线程调度,需要深刻了解以下几个基础知识点... 查看详情

廖雪峰java11多线程编程-2线程同步-2synchronized方法(代码片段)

1.Java使用synchronized对一个方法进行加锁classCounterintcount=0;publicsynchronizedvoidadd(intn)count+=n;publicsynchronizedvoiddec(intn)count-=n;publicintget()//读取一个int类型是原子操作,不需要同步returncount;classAddThre 查看详情

廖雪峰java11多线程编程-3高级concurrent包-1reentrantlock(代码片段)

线程同步:是因为多线程读写竞争资源需要同步Java语言提供了synchronized/wait/notify编写多线程同步很困难所以Java提供了java.util.concurrent包:更高级的同步功能简化多线程程序的编写JDK>=1.5java.util.locks.ReetrantLock用于替代synchronized... 查看详情

c++11多线程入门<学习记录;(代码片段)

最近学习了c++多线程相关知识,也算是对这方面内容的入门视频链接c++11并发与多线程视频课程看了大概两周,简单进行总结参考文章C++11并发与多线程PS:c++11提供了标准的可跨平台的线程库,本次多线程开发以此库为核心一.并... 查看详情

c++11多线程编程-两个进程轮流打印1~100(代码片段)

...重新上锁;参考代码://notify_one()(随机唤醒一个等待的线程)//notify_all()(唤醒所有等待的线程)//CreateBy@herongwei2019/09/10#include<bits/stdc++.h>#include<mutex>#include<th 查看详情