【c++线程库】

ops/2024/12/15 20:26:46/

文章目录

  • 线程创建方式
  • mutex
  • 条件变量
  • atomic

线程创建方式

头文件

#include<thread>

在这里插入图片描述

线程创建传个可执行对象就可以,如函数指针,仿函数,lambda,包装器。后面的Args是可变参数包。

使用函数指针创建线程

void fun(int& a)
{a = 1;cout << "thread: void fun()" << endl;
}

首先传可执行对象,参数传后面thread的Args会解析参数包,引用参数需要+ref()。

int a = 0;
thread t1(fun,ref(a));
t1.join();
cout << a << endl;

使用lambda创建线程

int a = 0;
thread t2([&]() {a = 3;cout << "lambda" << endl;});
t2.join();
cout << a << endl;

线程创建后需要join等待回收线程的资源。

mutex

头文件

#include<mutex>

锁不能被拷贝。

创建多个线程时对于需要访问的同一个变量通常需要加锁,否则会有线程安全问题。

创建一个锁并在临界区进行加锁。

mutex mtx;
int a = 0;
thread t1([&]() {for (int i = 0; i < 10000; i++){mtx.lock();a++;mtx.unlock();}
});
thread t2([&]() {for (int i = 0; i < 10000; i++){mtx.lock();a++;mtx.unlock();}
});
t1.join();
t2.join();
cout << a << endl;

也可使用lock_guard利用RAII自动加锁解锁

template<class T>
class Lock_Guard
{
public:Lock_Guard(T& mtx):_mtx(mtx){_mtx.lock();}~Lock_Guard(){_mtx.unlock();}
private:T& _mtx;
};

在这里插入图片描述

条件变量

创建一个条件变量

condition_variable cv;

在这里插入图片描述
wait可以让线程在这里阻塞等待,直到被其他线程唤醒,在等待前会自动unlock解锁,被唤醒时会自动加上锁。

mutex mtx;
condition_variable cv;
unique_lock<mutex> lock(mtx);
cv.wait(lock);

在这里插入图片描述
notify_one随机唤醒一个线程,notify_all唤醒所有其他线程。

cv.notify_one();
cv.notify_all();

创建三个线程交替打印数字

int main()
{mutex mtx;condition_variable cv;int flag = 0;int a = 0;thread t1([&]() {for (int i = 0; i < 10; i++){unique_lock<mutex> lock(mtx);while (flag!=0)cv.wait(lock);flag = 1;a++;std::cout << "thread t1" << ": " << a << endl;cv.notify_all();}});thread t2([&]() {for (int i = 0; i < 10; i++){unique_lock<mutex> lock(mtx);while (flag!=1)cv.wait(lock);flag = 2;a++;std::cout << "thread t2" << ": " << a << endl;cv.notify_all();}});thread t3([&]() {for (int i = 0; i < 10; i++){unique_lock<mutex> lock(mtx);while (flag!=2)cv.wait(lock);flag = 0;a++;std::cout << "thread t3" << ": " << a << endl;cv.notify_all();}});t1.join();t2.join();t3.join();return 0;
}

atomic

#include<atomic>

原子库,使用CAS操作比较和交换实现无锁编程。
这样就不需要加锁了
在这里插入图片描述


http://www.ppmy.cn/ops/142198.html

相关文章

抖音后端实习一面总结

置之死地而后生 抖音后端开发实习一面 自我介绍 你参加了PAT比赛&#xff1f;介绍一下&#xff1f; 平时有刷题吗&#xff1f;有的&#xff0c;那来做一下算法题目吧&#xff0c;单词拆分&#xff08;动态规划1h过去了...&#xff09; TCP有哪些状态&#xff1f;每种状态代表…

Android Compose 悬浮窗

今天需要写一个悬浮窗&#xff0c;但是在 Compose 中显示悬浮窗会遇到生命周期问题&#xff0c;我搜了一下&#xff0c;竟然有博主还要付费才给看&#xff0c;我真的是&#xff0c;开源社会不过是闻道有先后&#xff0c;大家互帮互助才有未来&#xff0c;这样明目张胆的放几张收…

【游戏设计原理】8 - 霍华德的隐匿性游戏设计法则

1. 霍华德的隐匿性游戏设计法则 霍华德的隐匿性游戏设计法则的核心思想是&#xff1a;“秘密的重要性与其表面上的无辜性和完整度成正比”。这意味着&#xff0c;当游戏开始时&#xff0c;设计上越是简洁、无害、直观的元素&#xff0c;隐藏的深层意义和转折就会显得更加震撼和…

deepin 安装 hive

deepin 安装 hive 安装 hadoop安装 mysql安装 hive 准备 HDFS配置 vim $HADOOP_HOME/etc/hadoop/core-site.xml <!--配置所有节点的lhz用户都可作为代理用户--><property><name>hadoop.proxyuser.lhz.hosts</name><value>*</value><…

梳理你的思路(从OOP到架构设计)_架构设计的UML图形思考03

目录 1、绘制UML基於类别图 &#xff1a;表达接口(Interface) 接口的表达 Astah操作 接口实现 类 <实现>接口的表达 接口的使用(调用接口的函数) 2、接口的表示 在C裡&#xff0c; 在Java里 1、绘制UML基於类别图 &#xff1a;表达接口(Interface) 接口的表达 …

webrtc学习----前端推流拉流,局域网socket版,一对多

提示&#xff1a;局域网socket版&#xff0c;一对多 文章目录 [TOC](文章目录) 前言一、教程二、webrtc工作流程三、推流端四、拉流五、socket服务六、效果七、备注总结 前言 ‌‌‌‌‌WebRTC&#xff08;Web Real-Time Communication&#xff09;‌是一种实时通讯技术&#x…

“AI数据生成系统:创造数据新动力

嘿&#xff0c;大家好&#xff01;今天咱们来聊聊一个特别火的话题——AI数据生成系统。这玩意儿&#xff0c;听起来可能有点技术范儿&#xff0c;但其实它就像是我们的创意工厂&#xff0c;能源源不断地产出新鲜、有用的数据。 首先&#xff0c;咱们得搞清楚&#xff0c;AI数据…

AI Alignment: A Comprehensive Survey---摘要、简介

题目 人工智能对齐&#xff1a;全面调查 摘要 人工智能对齐旨在使人工智能系统的行为符合人类的意图和价值观。随着人工智能系统的能力不断增强&#xff0c;错位的风险也在不断增加。为了提供对齐领域的全面和最新概述&#xff0c;在本调查中&#xff0c;我们深入研究了对齐的…