【CPP】C++11多线程

news2024/9/22 10:07:00

thread类

在C++11之前,涉及到多线程问题,都是和平台相关的,比如windows和linux下各有自己的接口,这使得代码的可移植性比较差。C++11中最重要的特性就是对线程进行支持了,使得C++在并行编程时不需要依赖第三方库,而且在原子操作中还引入了原子类的概念。要使用标准库中的线程,必须包含< thread >头文件

构造

在这里插入图片描述
我们可以看到thread类不支持拷贝构造(delete关键词表示声明了某函数但禁止被使用,在编译时会直接报错),但支持传右值引用和完美转发。第一个参数是线程创建调用的函数,第二个是可变参数列表,支持传递多个参数。
举个例子

#include<thread>
#include<iostream>

using namespace std;
void Func(int n,int num)
{
	for (int i = 0; i < n; i++)
	{
		cout << num<<":"<<i << endl;
	}
	cout << endl;
}

int main()
{
	
	//thread t1(Func, 10,1);
	cin>>n;
	thread t1([n](int num){
	for(int i=0;i<n;i++)
	{
		cout<<num<<":"<<i<<endl;
	},n);
	thread t2(Func, 20,2);

	t1.join();
	t2.join();

	return 0;
}

当然这里func也可以换成lambda表达式,其次thread类虽然不支持拷贝构造,但支持移动构造和赋值。

namespace this_thread

在这里插入图片描述

yield

在这里插入图片描述
implementation:实施,实行
当一个线程调用此函数,将它的时间片交还给操作系统,让操作系统reschedule调度,从而避免阻塞等待。

mutex类

问题引入

看下面这段代码

int x = 0;
void func(int n)
{
	for (int i = 0; i < n; i++)
		x += 1;
}

int main()
{
	thread t1(func, 10000);
	thread t2(func, 20000);

	t1.join();
	t2.join();

	cout << x << endl;
	return 0;
}

按理来说执行结果应该是30000,但实际上执行结果不但不为30000,而且每次还不一样。
在这里插入图片描述

解决方案

在这里插入图片描述
定义一个全局的锁,在每一次对全局变量x++的时候互斥访问临界资源

成员函数

在这里插入图片描述

lockguard

template<class Lock>
class LockGuard
{
public:
	LockGuard(Lock& lk)
		:_lk(lk)
	{
		_lk.lock();
	}

	~LockGuard()
	{
		_lk.unlock();
	}

private:
	Lock& _lk //成员变量可以是引用,但必须在初始化列表初始化
};

但程序抛异常时,可能来不及释放锁,就被catch了,进而会造成死锁状态,用RAII的方式lock_guard会在作用域结束时由编译器自动调用析构函数
在这里插入图片描述

条件变量

实现两个线程交替打印1到100的数

//两个线程交替分别打印奇数和偶数
int main()
{
	mutex mtx;
	condition_variable cond;
	int n = 100;
	int x = 1;

	thread t1([&, n]() {
		while (x < n)
		{
			unique_lock<mutex> lock(mtx);
			if (x % 2 == 0)//打印奇数,偶数阻塞
				cond.wait(lock);
			cout << this_thread::get_id() << ":"<<x++<<endl;
			cond.notify_one();
		}
		});
	thread t2([&, n]() {
		while (x < n)
		{
			unique_lock<mutex> lock(mtx);
			if (x % 2 != 0)
				cond.wait(lock);
			cout << this_thread::get_id() <<":"<<x++<< endl;
			cond.notify_one();
		}
		});

	t1.join();
	t2.join();
	return 0;
}

如果不加奇偶判断,那么假设t1打完数字1后,通知t2,此时t1与t2是竞争cpu,出了作用域,lock自动释放,如果不阻塞t1,那么t1很有可能再次获取到锁,所以存在t1连续运行的情况
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1536804.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习500问——Chapter04:经典网络解读(1)

文章目录 4.1 LeNet-5 4.1.1 模型介绍 4.1.2 模型结构 4.1.3 模型特性 4.2 AlexNet 4.2.1 模型介绍 4.2.2 模型结构 4.2.3 模型特性 4.3 ZFNet 4.3.1 模型介绍 4.3.2 模型结构 4.3.3 模型特性 4.4 Network in Network 4.4.1 模型介绍 4.4.2 模型结构 4.4.3 模型特性 4.1 LeNet-…

60、服务攻防——中间件安全CVE复现weblogicJenkinsGlassFish

文章目录 weblogicJbossJenkinsGlassFish weblogic 默认端口&#xff1a;7001&#xff0c;历史漏洞&#xff1a;CVE_2017_3506、CVE_2018_2893、CVE_2018_3245、CVE_2020_14882、CVE_2021_2394 Jboss 历史漏洞&#xff1a;CVE-2017-12149、CVE-2017-7504 Jenkins GlassFis…

安卓 Android Activity 生命周期

文章目录 Intro生命周期方法 & 执行顺序结论code Intro 本文提供一个测试类通过打印的方式展示在多个Activity之间互相跳转的时候&#xff0c;各个Activity的生命周期相关方法的执行顺序。 生命周期方法 & 执行顺序结论 下图出自 郭霖 《第一行代码&#xff08;第二…

深度学习pytorch——激活函数损失函数(持续更新)

论生物神经元与神经网络中的神经元联系——为什么使用激活函数&#xff1f; 我们将生物体中的神经元与神经网络中的神经元共同分析。从下图可以看出神经网络中的神经元与生物体中的神经元有很多相似之处&#xff0c;由于只有刺激达到一定的程度人体才可以感受到刺激&#xff0c…

微服务高级篇(三):分布式缓存+Redis集群

文章目录 一、单点Redis的问题及解决方案二、Redis持久化2.1 单机安装Redis2.2 RDB持久化2.3 AOF持久化2.4 RDB和AOF对比 三、Redis主从3.1 搭建Redis主从架构3.1.1 集群结构3.1.2 准备实例和配置3.1.3 启动3.1.4 开启主从关系3.1.5 测试 3.2 数据同步3.2.1 全量同步【建立连接…

Windows11企业版安装WSL2和Ubuntu发布版(避坑)

背景 win10企业版升级win11企业版后&#xff0c;安装WSL2&#xff0c;最后安装WSL的Ubuntu发布版&#xff0c;尝试网上各种方法&#xff0c;还是出现文章第三节所写的问题&#xff0c;差点被这问题搞放弃了&#xff0c;全网少有针对这个问题的答案&#xff0c;有也不顶用&…

python-pandas基础学习

可参考&#xff1a; pandas&#xff1a;http://pandas.pydata.org/docs/user_guide/10min.html 一、基础知识 DataFrame 方法&#xff0c;可以将一组数据&#xff08;ndarray、series, map, list, dict 等类型&#xff09;转化为表格型数据 import pandas as pd data {name: …

Python代码规范化

什么是代码规范化&#xff1f; 代码的规范化书写是指按照一定的规范和标准编写代码&#xff0c;使得代码结构清晰、易于阅读和理解。 代码规范化的意义 Python代码规范化的意义在于提高代码可读性、可维护性和可重用性&#xff0c;从而使代码更易于理解、调试和协作&#xff0c…

解锁AI生成模型的无限可能:Stability-AI 带你领略前沿科技

厌倦了千篇一律的图片和视频&#xff1f;想要创作独一无二的艺术作品&#xff1f;Stability-AI 横空出世&#xff0c;为你打开通往 AI 生成模型的大门&#xff0c;带你领略前沿科技的无限可能&#xff01; 神奇的功能&#xff0c;尽在掌握 Stability-AI 拥有众多令人惊叹的功能…

AI基础知识(4)--贝叶斯分类器

1.什么是贝叶斯判定准则&#xff08;Bayes decision rule&#xff09;&#xff1f;什么是贝叶斯最优分类器&#xff08;Bayes optimal classifier&#xff09;&#xff1f; 贝叶斯判定准则&#xff1a;为最小化总体风险&#xff0c;只需在每个样本上选择那个能使条件风险最小的…

js - 练习题

文章目录 FED3&#xff1a;查找两个节点的最近的一个共同父节点FED4&#xff1a;根据包名&#xff0c;在指定空间中创建对象FED5: 数组去重FED6&#xff1a;用 JavaScript 实现斐波那契数列函数,返回第n个斐波那契数。 f(1) 1, f(2) 1 等FED12&#xff1a;字符串统计FED17&am…

联想ThinkSystem服务器主要硬件Windows Server驱动下载说明

故障现象&#xff1a; 不知道如何获取ThinkSystem系列服务器在Windows Server操作系统下的驱动程序&#xff1f; 解决方案&#xff1a; 本文提供ThinkSystem系列服务器安装Windows Server操作系统所需要的驱动程序下载说明。 以下多路机型的Windows Server 2012 R2及2016驱动…

Linux基础命令[20]-useradd

文章目录 1. useradd 命令说明2. useradd 命令语法3. useradd 命令示例3.1 不加参数3.2 -d&#xff08;指定家目录&#xff09;3.3 -g&#xff08;指定用户组&#xff09;3.4 -G&#xff08;指定附属组&#xff09;3.5 -p&#xff08;加密密码&#xff09;3.6 -e&#xff08;指…

【JDBC编程】Java连接MySQL的五个步骤

目录 JDBC编程 1.JDBC的使用 2.数据库连接Connection 3.Statement对象 4.ResultSet对象 JDBC编程 JDBC编程运用了MySQL提供的 Java 的驱动包 mysql-connector-java &#xff0c;需要基于 Java 操作 MySQL 即需要该驱动包。同样的&#xff0c; 要基于 Java 操作 Oracle 数据库…

XML Data – Semi-Structured Data XML 数据 - 半结构化数据

Outline • Structured, Semistructured, and Unstructured Data • XML Hierarchical (Tree) Data Model • Extracting XML Documents from Relational Databases • XML Documents, DTD, and XML Schema • XML Languages 结构化、半结构化和非结构化数据 - XML 层次&#x…

Java最后一块石头的重量 II(力扣Leetcod1049)

最后一块石头的重量 II 力扣原题 有一堆石头&#xff0c;用整数数组 stones 表示。其中 stones[i] 表示第 i 块石头的重量。 每一回合&#xff0c;从中选出任意两块石头&#xff0c;然后将它们一起粉碎。假设石头的重量分别为 x 和 y&#xff0c;且 x < y。那么粉碎的可能结…

Java学习笔记NO.24

T1.完成理工超市系统的商品类及其子类的定义&#xff0c;实现“浏览商品”及“查看商品详情”功能 &#xff08;1&#xff09;商品类 public class Goods {public String name;public double price;public int count;public String desc;public Goods(String name, double p…

C/C++代码性能优化——编程实践

1. 编程实践 在一些关键的地方&#xff0c;相应的编程技巧能够给性能带来重大提升。 1.1. 参数传递 传递非基本类型时&#xff0c;使用引用或指针&#xff0c;这样可以避免传递过程中发生拷贝。参数根据是否需要返回&#xff0c;相应加上const修饰&#xff0c;代码更安全&am…

matlab实现机器学习svm

一、目的和要求 1.编程实现SVM训练函数和预测函数&#xff1b; 2.绘制线性和非线性边界&#xff1b; 3.编写线性核函数 二、算法 1.线性svm&#xff1a; 分离超平面&#xff1a;wxb0&#xff0c;对于线性可分的数据集来说&#xff0c;这样的超平面有无穷多个&#xff08;…

局部路径规划算法 - 贝塞尔曲线法 C++ matlab

参考资料&#xff1a; &#xff08;1&#xff09;贝塞尔曲线法 &#xff08;2&#xff09;曲线杂谈&#xff08;二&#xff09;&#xff1a;Bezier曲线的特殊性质 贝塞尔曲线法 1 算法概述 1.1 算法简介 贝塞尔曲线于1962年由法国工程师皮埃尔贝塞尔&#xff08;Pierre Bzi…