广州网站设计易企建站成品网站源码在线观看

bicheng/2026/1/26 11:06:34/文章来源:
广州网站设计易企建站,成品网站源码在线观看,wordpress后台登录不上,建设银行信用卡网站多少文章目录 线程线程互斥锁死锁 线程同步生产者消费者模型POSIX信号量基于环形队列的生产消费模型 线程池 线程 线程是进程内部可以独立运行的最小单位 进程是资源分配的基本单位#xff0c;线程是调度器调度的基本单位 线程在进程的地址空间内运行 进程内的大部分资源线程是… 文章目录 线程线程互斥锁死锁 线程同步生产者消费者模型POSIX信号量基于环形队列的生产消费模型 线程池 线程 线程是进程内部可以独立运行的最小单位 进程是资源分配的基本单位线程是调度器调度的基本单位 线程在进程的地址空间内运行 进程内的大部分资源线程是共享的但也有属于线程自己的独立资源主要是寄存器和栈位于共享区 为什么引入线程 创建新线程的工作要比创建新进程的工作少得多 线程的切换要比进程的切换所作的工作少得多 线程异常 单个线程出现崩溃会导致整个进程奔溃因为线程是在进程内部运行的 Linux下的线程 Linux将线程视为一种特殊类型的进程称作轻量级进程Lightweight ProcessLWP Linux并没有提供系统调用来对线程进行操作对线程操作使用的是第三方库 来段代码感受一下 #include iostream #include unistd.h #include pthread.h using namespace std;void *routine(void *args) {while (true){printf(sub process running ... pid:%d\n, getpid());sleep(1);} }int main() {pthread_t t;pthread_create(t, nullptr, routine, nullptr);while (true){printf(main process running ... pid:%d\n, getpid());sleep(3);}pthread_join(t, nullptr);return 0; }运行结果如下 程序运行起来之后检测可以看到有两个线程其中一个pid和lwp相等这就是主线程下面的就是新线程 每个进程内部至少有一个线程主线程 线程互斥 锁 多个线程在对同一份资源进行访问时很可能会造成数据紊乱的问题来看个例子 #include iostream #include unistd.h #include pthread.h using namespace std;int num 10000;void *routine(void *args) {while (true){if (num 0){usleep(100);printf(%d\n, num);num--;}else{break;}usleep(1000);}}int main() {const int n 100;pthread_t t[n];for (size_t i 0; i n; i){pthread_create(t i, nullptr, routine, nullptr);}for (size_t i 0; i n; i){pthread_join(t[i], nullptr);}return 0; }创建两个新线程让这两个线程对同一个数字进行争夺类似于抢票没有票就退出 只看最后的几个结果 这里n0时明显不能进入if语句但是后面居然打印出负数 这就是多线程对于同一份资源在进行访问时造成的数据紊乱 临界区 临界区是指一段代码当一个线程或进程进入这段代码并开始执行时其他线程或进程不能同时进入执行该段代码的区域。这是为了确保共享资源在同一时间只能被一个线程访问避免数据竞争和不一致的状态。 临界资源 临界资源是指在多线程或多进程环境中被共享访问的数据、对象或资源。因为多个线程或进程可能同时访问这些资源所以需要在访问它们时确保数据的一致性和正确性。 如何对临界资源进行保护------‘锁’ 锁的使用可以确保当一个线程在访问共享资源时其他线程无法同时访问该资源从而保证数据的一致性和正确性。 对刚才代码稍作修改 #include iostream #include unistd.h #include pthread.h using namespace std;pthread_mutex_t mutex PTHREAD_MUTEX_INITIALIZER; int num 10000;void *routine(void *args) {while (true){pthread_mutex_lock(mutex);if (num 0){usleep(100);printf(%d\n, num);num--;pthread_mutex_unlock(mutex);}else{pthread_mutex_unlock(mutex);break;}usleep(1000);} }int main() {const int n 100;pthread_t t[n];for (size_t i 0; i n; i){pthread_create(t i, nullptr, routine, nullptr);}for (size_t i 0; i n; i){pthread_join(t[i], nullptr);}pthread_mutex_destroy(mutex);return 0; }这次运行结果就正常了 有了锁就能保证每次只有一个线程能够访问到临界资源 死锁 死锁是指两个或多个线程互相等待对方持有的资源而无法继续执行的情况。 死锁的4个必要条件 互斥一个资源每次只能被一个执行流使用请求与保持一个执行流因请求资源而阻塞时对已获得的资源保持不放不剥夺:一个执行流已获得的资源在末使用完之前不能强行剥夺循环等待:若干执行流之间形成一种头尾相接的循环等待资源的关系 避免死锁 破坏死锁的四个必要条件加锁顺序一致… 线程同步 在多个线程互斥的访问临界资源时只有一个能获得临界资源其他线程只能忙等待什么也做不了 两个问题 存在多个线程竞争同一个临界资源的情况每次都是其中一个线程获得临界资源造成其他线程的饥饿问题在临界资源没有就绪的时候线程不停的申请锁—判断临界资源事否就绪—释放锁一直重复不合理 如何解决条件变量 条件变量允许一个或多个线程等待满足某些条件时继续执行。 void push(const T val) {pthread_mutex_lock(_mtx);while (is_full()){pthread_cond_wait(_full, _mtx);}_q.push(val);cout Producer Thread [ pthread_self() ] Produced val endl;pthread_mutex_unlock(_mtx);pthread_cond_signal(_empty); }截取一段代码举例 要点 等待时线程自动挂起并且释放手中的锁如果收到唤醒信号再在被阻塞的位置唤醒重新去申请锁为什么使用while循环不用if。要避免伪唤醒if出现伪唤醒的情况时会直接向下运行而while循环会再次检查资源事否就绪防止伪唤醒 生产者消费者模型 核心点 生产者在阻塞队列已满时不能继续放入数据消费者在阻塞队列为空时不能继续取出数据生产者与生产者之间互斥消费者与消费者之间互斥 阻塞队列 为了代码的健壮性使用泛型编程 字段 阻塞队列是个队列所以封装STL的队列 阻塞队列属于临界区对临界区访问应该似乎互斥的所以需要一把锁来控制生产者和消费者的互斥访问 条件变量不让临界区外的资源忙等待 队列容量 函数 构造、析构 基本的入队列和出队列 判断是否空是否满 #pragma once#include iostream #include queue #include pthread.h #include unistd.husing namespace std; #define BLOCK_SIZE 10template class T class BlockQueue { public:BlockQueue(size_t capacity BLOCK_SIZE): _capacity(capacity){pthread_mutex_init(_mtx, nullptr);pthread_cond_init(_full, nullptr);pthread_cond_init(_empty, nullptr);}void push(const T val){pthread_mutex_lock(_mtx);while (is_full()){pthread_cond_wait(_full, _mtx);}_q.push(val);cout Producer Thread [ pthread_self() ] Produced val endl;pthread_mutex_unlock(_mtx);pthread_cond_signal(_empty);}void pop(){pthread_mutex_lock(_mtx);while (isEmpty()){pthread_cond_wait(_empty, _mtx);}T s _q.front();_q.pop();cout Consumer Thread [ pthread_self() ] Consumed s endl;pthread_mutex_unlock(_mtx);pthread_cond_signal(_full);}~BlockQueue(){pthread_cond_destroy(_full);pthread_cond_destroy(_empty);pthread_mutex_destroy(_mtx);}private:bool isEmpty(){return _q.empty();}bool is_full(){return _capacity _q.size();}private:queueT _q;size_t _capacity;pthread_mutex_t _mtx;pthread_cond_t _full;pthread_cond_t _empty; };POSIX信号量 信号量的两个操作 p操作申请资源v操作释放资源 基于环形队列的生产消费模型 允许生产者和消费者在同一个数据结构上进行操作 核心点 生产者不能套圈消费者消费者不能超过生产者生产者与生产者之间互斥消费者与消费者之间互斥 环形队列 字段 封装vector 容量 生产者在队列的位置 消费者在队列的位置 消费信号 生产信号 消费锁 生产锁 函数 构造这里没有实现析构因为封装的锁和信号量各自的析构已经实现析构时会自动调用 入队列和出队列 #include iostream #include vector #include Sem.hpp #include Mutex.hpp #define SIZE 10template class T class RingQueue { public:RingQueue(size_t size SIZE): _size(size),_rq(size),_p_sem(size),_c_sem(0),_c_pos(0),_p_pos(0){}void push(const T val){_p_sem.p();_p_mtx.lock();_rq[_p_pos] val;_p_pos % _size;_p_mtx.unlock();_c_sem.v();}void pop(T *pv){_c_sem.p();_c_mtx.lock();*pv _rq[_c_pos];_c_pos % _size;_c_mtx.unlock();_p_sem.v();}private:std::vectorT _rq;size_t _size;size_t _c_pos;size_t _p_pos;Sem _c_sem;Sem _p_sem;Mutex _c_mtx;Mutex _p_mtx; };要点 为什么是先申请资源p操作再加锁申请信号量实际上一种“预定”先买票后入座这样可以确保每个进入临界区的线程要访问的资源已经就绪可以提升效率。 对锁进行封装 #pragma once #include pthread.h class Mutex {public:Mutex(){pthread_mutex_init(_mtx, nullptr);}~Mutex(){pthread_mutex_destroy(_mtx);}void lock(){pthread_mutex_lock(_mtx);}void unlock(){pthread_mutex_unlock(_mtx);}private:pthread_mutex_t _mtx; };对信号量进行封装 #pragma once#include semaphore.h class Sem { public:Sem(int value){sem_init(_sem, 0, value);}~Sem(){sem_destroy(_sem);}void p(){sem_wait(_sem);}void v(){sem_post(_sem);}private:sem_t _sem; };线程池 详情代码见实现简易线程池

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

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

相关文章

江苏网站建设 seowordpress博客建站

在C#中使用NPOI库读取和写入Excel文件,你需要先下载并安装NPOI库。你可以在NuGet管理器中搜索NPOI并进行安装。 以下是一个使用NPOI库进行Excel文件读取和写入的示例: 读取Excel文件: using NPOI.SS.UserModel; using NPOI.XSSF.UserModel…

网站宣传图十大暗网搜索引擎

Open Group于1997年10月发布,UUID遵从此协议。UUID被设计成一个在空间和时间上的唯一值。两次调用的UUID将产生两个不同的值,即使这些调用是在两个不连接的,彼此独立的计算机。由一串数字表示aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeeeformat:mys…

北辰苏州网站建设湖北省住房和城乡建设网站

文章目录 GUI 查看命令获取命令 free命令 vmstat命令 top命令 htop Linux 查看内存使用情况的几种方法包括使用 free 命令、top 命令、htop 命令、vmstat 命令和/proc/meminfo 文件。这些方法可以帮助用户了解系统内存的使用情况,包括总内存、已用内存、空闲内存、缓…

临沂做网站推广的公司设备报价单模板

Ubuntu共享文件到win 1、安装samba sudo apt-get install samba samba-common2、创建一个共享文件夹,并设置777权限 mkdir /home/qyh/share sudo chmod 777 /home/qyh/share我的用户名:qyh。 3、添加用户及密码 sudo smbpasswd -a qyh4、修改配置文…

青岛主流网站做网站的分析报告案例

​​​​​​​目录 1.引言 2. 机器学习基本概念与分类方法 2.1. 基本概念 1.2. 分类方法 3.主要应用场景与现实案例剖析 3.1. 推荐系统 3.2. 金融风控 3.3. 医学诊断 3.4. 自然语言处理 4.结束语 1.引言 在数字化时代,数据已成为驱动社会进步的关键要素。…

做网站建设需要什么资质湖南人文科技学院全国排名

一、插入排序 1.基本原理 插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上…

旅游网站品牌建设用什么工具做网站视图

1. CPM(Cost per mille),每千次展现收费 这是一种最为常见的广告模式,也是很多网站流量变现的一种途径,这种广告不管计算点击,或者什么注册下载之类的转化,只要这个广告在网站上被正常的展现给…

南昌seo网站建设营销型网站建站系统

温馨提醒:本文主要分为5个部分,总计4842字,需要时间较长,建议先收藏! P2P DMA简介 P2P DMA软硬件支持 CXL P2P DMA原理差异 P2P DMA应用场景 P2P DMA技术挑战 一、P2P DMA简介 P2P DMA(Peer-to-Peer…

本地服务器域名解析网站建设太原seo优化

python -m pip install --upgrade pip pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pypi | 镜像站使用帮助 | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror

做物流哪个网站推广效果好管局审核一定要能打开网站

使用Spacy python库做中文词性和词频分析,读取word并给出其中每个词的词频和词性,写入excel表。 1、为什么选择Spacy库 相比与NLTK这个库更快和更准 2、模型比较 zh_core_web_trf模型,模型大,准确性高。 需要确保你的Spacy版本是…

烟台网站快速优化排名网站核验点

我们很高兴今天.NET5.0正式发布。这是一个重要的版本—其中也包括了C# 9和F# 5大量新特性和优秀的改进。微软和其他公司的团队已经在生产和性能测试环境中开始使用了。这些团队向我们反馈的结果比较令人满意,它证明了对性能提升及降低Web应用托管成本的机会有积极的…

龙岗区网站制作建设学院网站的意义

目录 Mac 安装nvm 下载命令 配置环境变量 刷新 Mac(M1) 安装nvm 搜索 下载 为nvm创建文件夹 配置环境变量 刷新 Mac 安装nvm 下载命令 brew install nvm 配置环境变量 vi ~/.zshrc 内容如下: export NVM_DIR"$HOME/.nvm"[ -s "/usr/local…

网站建设和推广方案怎么把自己做的网站让外网访问

免责声明: 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…

如何查看网站是谁建设的天元建设集团有限公司张琥超

所谓断言,主要用于测试返回的数据结果进行匹配判断,匹配成功返回PASS,失败返回FAIL。 下图方法一,直接点击右侧例子函数,会自动生成出现在左侧窗口脚本,只需修改数据即可。 方法二:直接自己写脚…

怎么样做个网站德州市建设工程质量监督站网站

阿里云服务器租用费用,云服务器ECS经济型e实例2核2G、3M固定带宽99元一年、轻量应用服务器2核2G3M带宽轻量服务器一年87元,2核4G4M带宽轻量服务器一年165元12个月,ECS云服务器e系列2核2G配置99元一年、2核4G配置365元一年、2核8G配置522元一年…

有什么推广网站建筑工程分包信息网络平台

typescript类型检查和原始类型 类型检查 非严格类型是typescript默认的类型检查模式,在该模式下,类型检查的规则相对轻松,不会对undefined和null值做过多的限制,允许将undefined和null值赋给string类型的变量。进行JavaScript代…

asp.net网站开发代码公司网站代码模板

简介: Go语言出自Ken Thompson、Rob Pike和Robert Griesemer之手,起源于2007年,并在2009年正式对外发布。Go的主要目标是“兼具Python等动态语言的开发速度和C/C等编译型语言的性能与安全性”,旨在不损失应用程序性能的情况下降低…

广东网站建设找哪家怎样从用户体现提高网站的搜索引擎信任度

备注:这是我在2017年在自己的网站上写的文章,今天迁移过来。 昨天去参加了公司组织的一个关于网络安全的培训,了解了很多关于网络安全方面的知识,也才意识到网络安全是一项极其重要的领域。 本篇文章主要聊聊Web安全。不过我对于网…

做网站太累湛江专业建站

本专题将主要介绍Exchange2013从部署前准备、正式部署到应用配置和维护的整个过程。博文是我在自己做测试的过程中自己编写的,如果大家有什么意见或问题也欢迎一起讨论交流。废话不多说,下面进入正题。本节将主要介绍部署Exchange2013之前需要准备的先决…

wordpress如何启用全站sslwordpress主题和模板下载

01 非标电表箱柜 本项目为创博智慧云产业研发中心的非标配电箱、电表箱设计原理图,地块一层含dwg图纸一份,包括配电箱壳体尺寸、原理图、接线图等20多种设计图纸。 02 住宅楼高压 低压 非标箱原理和箱体图 本图纸为高级住宅小区高低压非标箱设计原理…