【Linux】线程(下)
同步在保证数据安全的前提下让线程能够按照某种特定的顺序访问临界资源从而有效避免饥饿问题。条件变量条件变量是一种线程同步机制用于使线程在条件不满足时阻塞等待并在条件满足时由其他线程唤醒通常与互斥锁配合使用。cond:要初始化的条件变量 attr:NULLpthread_cond_wait让线程等待的时候会自动释放锁。唤醒等待int pthread_cond_broadcast(pthread_cond_t* cond);int pthread_cond_signal(pthread_cond_t* cond); 唤醒在cond等待队列中等待的一个线程通常是第一个。为什么pthread_cond_wait 需要互斥量?A:如果只有一个线程条件不满足会一直等下去所以必须要有一个线程通过某些操作改变共享变量使原先不满足的条件变满足并通知等待在条件变量上的线程。因为“条件的变化一定伴随着共享数据的变化”而共享数据如果不加锁就一定会出乱子。使用等待条件 pthread_mutex_lock(mutex); while (条件为假 { pthread_cond_wait(cond, mutex); } 修改条件 pthread_mutex_unlock(mutex);给条件发送信号 pthread_mutex_lock(mutex); 设置条件为真 pthread_cond_signal(cond); pthread_mutex_unlock(mutex);判断也是访问临界资源所以判断必须在加锁以后。线程池单例线程池#pragmaonce#includeiostream#includevector#includestring#includequeue#includepthread.h#includeunistd.hstructThreadInfo{pthread_t tid;std::string name;};staticconstintdefaultnum5;templateclassTclassThreadPool{public:voidLock(){pthread_mutex_lock(_mutex);}voidUnlock(){pthread_mutex_unlock(_mutex);}voidWakeup(){pthread_cond_signal(_cond);}voidThreadSleep(){pthread_cond_wait(_cond,_mutex);}boolIsQueueEmpty(){return_tasks.empty();}std::stringGetThreadName(pthread_t tid){for(constautoti:_threads){if(ti.tidtid)returnti.name;}returnNone;}staticvoid*HandlerTask(void*args){ThreadPoolT*tpstatic_castThreadPoolT*(args);std::string nametp-GetThreadName(pthread_self());while(true){tp-Lock();while(tp-IsQueueEmpty()){tp-ThreadSleep();}T ttp-Pop();tp-Unlock();t();// 放在解锁后多个线程可以同时处理数据。std::coutname run, result: t.GetResult()std::endl;}}voidStart(){intnum_threads.size();for(inti0;inum;i){_threads[i].namethread-std::to_string(i1);pthread_create((_threads[i].tid),nullptr,HandlerTask,this);}}TPop(){T t_tasks.front();_tasks.pop();returnt;}voidPush(constTt){Lock();_tasks.push(t);Wakeup();Unlock();}staticThreadPoolT*GetInstance(){if(_tpnullptr){pthread_mutex_lock(_lock);if(_tpnullptr){std::coutlog:singleton create done first!std::endl;_tpnewThreadPoolT();}pthread_mutex_unlock(_lock);}return_tp;}private:ThreadPool(intnumdefaultnum):_threads(num){pthread_mutex_init(_mutex,nullptr);pthread_cond_init(_cond,nullptr);}~ThreadPool(){pthread_mutex_destroy(_mutex);pthread_cond_destroy(_cond);}//ThreadPool(constThreadPoolT)delete;constThreadPoolToperator(constThreadPoolT)delete;//private:std::vectorThreadInfo_threads;std::queueT_tasks;pthread_mutex_t _mutex;pthread_cond_t _cond;staticThreadPoolT*_tp;staticpthread_mutex_t _lock;};//templateclassTThreadPoolT*ThreadPoolT::_tpnullptr;templateclassTpthread_mutex_t ThreadPoolT::_lockPTHREAD_MUTEX_INITALIZER;//单例模式这个类只能有一个对象外部不能随便 new提供一个全局访问入口。饿汉方式实现templatetypenameTclassSingleton{staticT data;public:staticT*GetInstance(){returndata;}};懒汉方式实现templatetypenameTclassSingleton{staticT*inst;public:staticT*GetInstance(){if(instNULL){instnewT();}returninst;}};核心思想“延时加载”从而优化服务器的启动速度。存在线程不安全的问题。第一次调用GetInstance时若两个线程同时调用可能会创建出两份T对象实例。修改如下//线程安全templateclassTclassSingleton{volatilestaticT*inst;staticstd::mutex lock;public:staticT*GetInstance(){if(instNULL){lock.lock();if(instNULL){instnewT();}lock.unlock();}returninst;}};STL中的容器是否是线程安全的?不是.STL 的设计初衷是将性能挖掘到极致, 而一旦涉及到加锁保证线程安全, 会对性能造成巨大的影响.而且对于不同的容器, 加锁方式的不同, 性能可能也不同(例如hash表的锁表和锁桶).因此 STL 默认不是线程安全. 如果需要在多线程环境下使用, 往往需要调用者自行保证线程安全.智能指针是否是线程安全的?unique_ptr 通常用于局部作用域下的独占资源管理因为所有权唯一使用场景比 shared_ptr 简单如果它不被多个线程共享访问通常不需要额外考虑线程同步。对于 shared_ptr, 多个对象需要共用一个引用计数变量, 所以会存在线程安全问题. 但是标准库实现的时候考虑到了这个问题, 基于原子操作(CAS)的方式保证 shared_ptr 能够高效, 原子的操作引用计数.

相关新闻

Next.js Script 组件详解

Next.js Script 组件详解

文章目录一、为什么不能直接用 <script>&#xff1f;1️⃣ 阻塞页面渲染2️⃣ 执行时机不可控3️⃣ 无法被 Next.js 优化二、什么是 next/script&#xff1f;三、基本引入 vs 全局引入&#xff08;非常容易混淆&#xff09;3.1 什么是「基本引入」&#xff08;页面级 / 组…

2026/8/25 10:26:11 阅读更多 →
企业级AI智能体平台选型:Hermes与OpenClaw深度对比与实战指南

企业级AI智能体平台选型:Hermes与OpenClaw深度对比与实战指南

1. 项目概述&#xff1a;企业级AI智能体平台选型之争最近在跟几个技术负责人聊天&#xff0c;发现大家不约而同地都在关注同一个问题&#xff1a;面对市面上涌现的各类AI智能体开发框架&#xff0c;到底该选哪个来支撑公司的业务&#xff1f;尤其是当项目从个人玩具或部门试点&…

2026/8/26 12:14:36 阅读更多 →
OpenClaw AI智能体安全平台部署与实战:从零构建自动化安全运营中心

OpenClaw AI智能体安全平台部署与实战:从零构建自动化安全运营中心

1. 项目概述&#xff1a;当“养虾”成为安全工程师的新黑话最近在安全圈和AI开发者社群里&#xff0c;“养虾”这个词突然火了起来。不明就里的朋友可能以为我们在讨论水产养殖&#xff0c;但实际上&#xff0c;这指的是部署和运维一个名为“OpenClaw”&#xff08;因其图标酷似…

2026/8/26 12:15:21 阅读更多 →

最新新闻

OCPP1.6 Smart Charging 解读

OCPP1.6 Smart Charging 解读

1、关于智能充电的解读&#xff1a;以下是个人理解&#xff0c;不一定准确&#xff0c;有误及时修改2、 SetChargingProfile.req 协议内容csChargingProfiles展开chargingSchedule展开&#xff0c;表示充电计划表的具体信息chargingSchedulePeriod展开&#xff0c;表示具体每个…

2026/8/26 14:04:07 阅读更多 →
当删除手机数据变成重罪:数字时代隐私权的至暗时刻

当删除手机数据变成重罪:数字时代隐私权的至暗时刻

我是AI时代的无业游民&#xff0c;我游荡在现实与意念之间当删除手机数据变成重罪&#xff1a;数字时代隐私权的至暗时刻 你有没有想过&#xff0c;一次普通的手机解锁操作&#xff0c;可能会让你面临长达20年的牢狱之灾&#xff1f;这不是科幻电影的桥段&#xff0c;而是正在美…

2026/8/26 14:04:07 阅读更多 →
国产长芯微LDC8562完全P2P替代DAC8562数模转换芯片DAC

国产长芯微LDC8562完全P2P替代DAC8562数模转换芯片DAC

LDC8562器件分别是低功耗、电压输出、双通道、16位数模转换器&#xff08;DAC&#xff09;。这些设备包括一个2.5V、4-ppm/C的内部参考&#xff0c;提供2.5V或5V的满标度输出电压范围。内部参考的初始精度为5mV&#xff0c;可以在VREFIN/VREFOUT引脚上提供或吸收高达20mA的电流…

2026/8/26 14:04:07 阅读更多 →
0xc000012d错误无法启动程序?先看懂缺失的运行库,再做一个自动修复

0xc000012d错误无法启动程序?先看懂缺失的运行库,再做一个自动修复

文章目录0xc000012d 错误码&#xff0c;它究竟在表达什么你的电脑为什么会缺这些运行库自己动手修复&#xff1a;一条可行但磨人的路换一个思路&#xff0c;让工具自动完成修复别忘了 DirectX 也可能是帮凶修复之后仍打不开&#xff0c;再试最后一招0xc000012d 错误码&#xff…

2026/8/26 14:04:07 阅读更多 →
Tongweb7049+TongRDS2214-2216+THS6010-6012 开机自启动(by lqw)

Tongweb7049+TongRDS2214-2216+THS6010-6012 开机自启动(by lqw)

原理 配置rc.local&#xff08;这个网上有很多示范&#xff0c;为了方便使用&#xff0c;在这里总结一下各个产品的配置&#xff09; Tongweb7049 Tongweb7049 本身自带开机自启动脚本&#xff08;bin目录下的installxxx.sh&#xff09;&#xff0c;但是有时执行失败的话&#…

2026/8/26 14:04:07 阅读更多 →
three.js 开发者必装的终极调试神器 three-devtools:告别 console.log 定位 3D 问题

three.js 开发者必装的终极调试神器 three-devtools:告别 console.log 定位 3D 问题

three.js 开发者必装的终极调试神器 three-devtools&#xff1a;告别 console.log 定位 3D 问题 【免费下载链接】three-devtools three.js devtools 项目地址: https://gitcode.com/gh_mirrors/th/three-devtools three-devtools 是一款专为 three.js 打造的浏览器开发…

2026/8/26 14:03:05 阅读更多 →

日新闻

Python random 模块常用函数详解:从入门到实战

Python random 模块常用函数详解:从入门到实战

目录 1. 引言2. 准备工作3. 基础随机函数4. 序列相关函数5. 随机种子与复现6. 实战案例7. 注意事项8. 常见问题与排查9. 总结 1. 引言 摘要&#xff1a; 本文系统介绍 Python 标准库 random 模块中最常用的随机数生成函数。内容涵盖基础随机函数&#xff08;random()、unifor…

2026/8/26 0:00:40 阅读更多 →
《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》读书笔记--第三章Databases and Database Files(2)

《Microsoft Sql server 2008 Internals》索引目录&#xff1a; 《Microsoft Sql server 2008 Internals》读书笔记--目录索引 在上篇文章中&#xff0c;主要介绍了创建数据库的基本语法和FileGroup的初步知识。需要注意的是: 关于FileGroup 如果你的系统是用Raid设备直接存…

2026/8/26 1:18:18 阅读更多 →
政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体怎么建?三种模式、三步路径与四个误区

政务AI智能体已经从概念试点阶段&#xff0c;转入了政务服务的常态化落地应用&#xff1b;在实际使用过程中&#xff0c;它能自主理解办事需求、辅助完成填报申报、开展材料预审&#xff0c;并联动多个系统协同作业&#xff0c;真正嵌入到政务办理的全流程当中。但在落地推进过…

2026/8/26 1:18:18 阅读更多 →

周新闻

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态&#xff0c;宏观上观察到的光是由无数个微观的光量子组成的&#xff0c;每个光子在产生的瞬间&#xff0c;其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前&#xff0c;在微观层面&#xff0c;每个光量子的运动轨迹是以波函数所展现…

2026/8/25 3:38:12 阅读更多 →
SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”&#xff0c;而是SIP会话的动态重定向你有没有遇到过这样的场景&#xff1a;客服坐席A正在和客户通电话&#xff0c;突然需要把这通对话无缝转给专家坐席B&#xff0c;客户完全感知不到中间的断连——既没听到忙音&#xff0c;也没被要求重新拨号…

2026/8/25 3:38:18 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack&#xff1f;如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法&#xff0c;那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/25 3:38:23 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速&#xff1a;macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/26 3:50:20 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南&#xff1a;3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗&#xff1f;ncmdump解密工具帮你轻松解决这个困…

2026/8/25 10:31:12 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片&#xff1a;为英语学习 App 打造桌面级学习助手适用平台&#xff1a;HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0&#xff08;API 26 Beta&#xff09;新增了 AgentCard 智能体卡片能力&#xff0c;这是继 HMAF&#xff08;鸿蒙智能体框架&#x…

2026/8/26 1:24:05 阅读更多 →