郑同学的笔记
CSDN官方认证C++领域优质创作者,CSDN博客专家,2023年6月城市(西安)之星TOP35。分享学习、记录成长。
展开
-
【并发编程二十三】linux系统,c++启动进程、杀进程、查询进程id
简介:在Linux系统中,使用C++编写程序可以通过多种方式控制进程,如启动程序、杀死进程和查询进程ID。本教程将详细介绍在Linux系统中使用C++的system函数、popen函数、fork函数以及相关命令的区别和用法。原创 2023-07-24 06:00:00 · 876 阅读 · 0 评论 -
进程(Process)和线程(Thread)
一、简介1.对于操作系统来说,一个任务就是一个进程(Process),比如打开一个浏览器就是启动一个浏览器进程,打开一个记事本就启动了一个记事本进程,打开两个记事本就启动了两个记事本进程,打开一个Word就启动了一个Word进程。2.有些进程还不止同时干一件事,比如Word,它可以同时进行打字、拼写检查、打印等事情。在一个进程内部,要同时干多件事,就需要同时运行多个“子任务”,我们把进程内的这...原创 2019-10-14 19:24:41 · 723 阅读 · 0 评论 -
线程同步的四种方式
一、为什么要进行线程同步?多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题。如果一个线程负责改变此变量的值,而其他线程负责同时读取变量内容,则不能保证读取到的数据是经过写线程修改后的。为了确保读线程读取到的是经过修改的变量,就必须在向变量写入数据时禁止其他线程对其的任何访问,直至赋值过程结束后再解除对其他线程的访问限制。这种保证线程能了解其他线程任务处理结束后的处理结果而采取的保...原创 2019-10-15 14:50:48 · 9930 阅读 · 0 评论 -
【并发编程二十二】通过进程名字杀死进程TerminateProcess
并发编程系列,我们只加写了如何启动一个子进程,这个子进程可以自己退出,但是并没有讲解如何通过进程名字强杀进程,这里我们讲解下。并讲解下可能遇到的三个问题。原创 2023-07-17 06:00:00 · 680 阅读 · 0 评论 -
【并发编程二十一:终章】c++20协程( co_yield、co_return、co_await )
对比代码中的备注,我们知道协程开始时,在协程的状态对象分配内存后,调用promise_type的构造函数为协程的状态对象分配内存失败时构造成功后开始执行在以上函数后执行协程结束前执行出现未经处理的异常时执行co_return 时执行,return_void跟return_value二选一co_yield时执行。原创 2023-03-05 18:00:00 · 2594 阅读 · 0 评论 -
【并发编程十七】c++实现一个线程池
1、《c++并发编程实战(第二版)》安东尼.威廉姆斯 著;以下文字可以在理解完毕线程池的代码后再来看下。2、《c++服务器开发精髓》 张远龙 著;原创 2023-02-20 07:00:00 · 706 阅读 · 2 评论 -
【并发编程十九】芊程(fiber)
芊程(fiber)是windows系统中的概念。当我们需要异步执行一些任务时,常见的作法就是开启一个工作线程,在工作线程中执行我们的任务。对于线程的调度是由操作系统内核控制的,所以我们无法确认操作系统何时会运行或挂起该线程。对于一些轻量级的任务,创建一个新的线程去做,消耗较大。那么有没有一种机制,既能新建线程执行任务,又没有新建线程消耗那么大呢?有,这就是芊程。原创 2023-02-27 07:59:40 · 361 阅读 · 0 评论 -
【并发编程十八】线程局部存储(TLS)
线程局部存储是指对象内存在线程开始后分配,线程结束时回收,且每个线程有该对象自己的实例。简单的说,线程局部存储的对象都是独立于各个线程的。实际上,这不是一个新鲜的概念,虽然c++一直没有在语言层面支持它,但是很早之前操作系统就有办法执行线程局部存储了。(c++直到c++11才从语言层面实现了)linux上的NTPL库提供了一套函数接口来实现线程局部存储pthread_key_delete:为线程局部存储创建一个新的key.pthread_setspecific:设值。原创 2023-02-22 18:52:16 · 812 阅读 · 0 评论 -
【并发编程十六】无锁数据结构(2)——无锁队列
【并发编程十六】无锁数据结构(2)——无锁队列一、简介二、原理图三、代码:实现三、代码:demo四、其他知识点1、delete 关键字2、delete 的扩展上一节我们讲解了无锁栈容器,这节我们讲解下无锁队列,如果大家还有基础知识不了解,建议先看下我的上两篇原子操作和无锁栈容器两篇文章。一、简介栈容器是后入先出,队列是先入先出。队列和栈容器稍微有点不同,因为对于队列结构,push和pop分别访问其不同的部分;而在栈容器上,这两项操作都访问头节点,所以两种数据结构所需的同步操作相异。如果某线程在队原创 2023-02-14 20:19:49 · 1314 阅读 · 0 评论 -
【并发编程二十】协程(coroutine)_协程库
简介,本文主要讲解协程的概念和对应的协程库。原创 2023-03-01 20:25:12 · 1109 阅读 · 0 评论 -
【并发编程十五】无锁数据结构(1)——无锁栈
栈容器能加入数据,然后按逆序取出——先进后出(后进先出——last in,fist out,LIFO).因此,我们必须保证,一旦某线程将一项数据加入栈容器,就能立即安全的被另一个线程取出,同时还得保证,只有唯一一个线程能获取该项数据。最简单的栈容器可以通过链表的形式实现:指针head指向第一个节点,各节点内的next成员指针再依次指向后继节点。原创 2023-02-06 21:25:32 · 2830 阅读 · 0 评论 -
【并发编程十三】c++原子操作(1)
std::atomic_flag是最简单的标准原子类型,表示一个布尔标志。该类型的对象只有两种状态:成立或置零。二者必居其一。经过刻意设计,它相当简单,唯一用途是充当构建单元,因此我们认为普通开发者一般不会直接使用它。尽管这样,我们从std:atomic_flag切入,仍能借以说明原子类型的一些通用原则,方便进一步讨论其他原子类型。std:atomic是基于整数类型的最基本的原子类型。相比std:atomic_flag,它是一个功能更加齐全的布尔标志。原创 2023-01-28 12:10:57 · 3856 阅读 · 0 评论 -
【并发编程十四】c++原子操作(2)——实现自旋锁
在介绍完原子操作,我们这篇使用c++提供的原子操作,实现一个自旋锁,并加以利用。原子操作参见[【并发编程十三】c++原子操作]原创 2023-02-02 19:52:38 · 1225 阅读 · 1 评论 -
【并发编程九】c++线程同步——互斥(mutex)
简介:本篇文章,我们详细的介绍下c++标准库提供的线程同步方法中的第一个——互斥(mutex)。原创 2023-01-03 19:53:34 · 1603 阅读 · 0 评论 -
【并发编程十二】c++20线程同步——信号量(semaphore)
【并发编程十二】c++20线程同步——信号量(semaphore)一、互斥二、条件变量三、future四、信号量1、信号量原理2、c++ 20 信号量3、demo简介:本篇文章,是线程同步的最后一篇。我们详细的介绍下c++标准库提供的线程同步方法——信号量(semaphore)。一、互斥参见【并发编程九】c++线程同步——互斥(mutex)二、条件变量参见【并发编程十】c++线程同步——条件变量(condition_variable)三、future参见【并发编程十一】c++线程同步——fu原创 2023-01-22 13:44:01 · 4398 阅读 · 0 评论 -
【并发编程十一】c++线程同步——future
本篇文章,我们详细的介绍下c++标准库提供的线程同步方法中的第3个——future。原创 2023-01-15 20:48:15 · 1327 阅读 · 0 评论 -
【并发编程十】c++线程同步——条件变量(condition_variable)
简介:本篇文章,我们详细的介绍下c++标准库提供的线程同步方法中的第二个——条件变量(condition_variable)。原创 2023-01-03 22:29:25 · 737 阅读 · 3 评论 -
【并发编程八】线程和线程同步
- 简介:本文介绍了windows系统、linux系统、c++标准库提供的多线程实现的方法,以及线程同步的相关知识。参考1、2、3、书籍《c++服务器开发精髓》——张远龙。原创 2022-12-29 19:13:43 · 489 阅读 · 2 评论 -
【并发编程七】C++进程通信——套接字(socket)_80行代码实现一个聊天软件
c++,80行代码实现一个聊天软件。刚写完《【操作系统二】图解TCP/IP模型+实战》、和《【操作系统三】图解网络IO(bio\nio\slect\epoll)》,和网络通信相关的基本都介绍清楚了,所以原本这篇socket通信不想再写了,但是考虑到【并发编程】系列不完整,所以才写了下了这篇。所以本篇文章所以本篇文章侧重Windows系统下socket的代码实战(写了一个简单的聊天软件),如果对什么是socket还没有清晰的印象,建议先读上面的两篇文章,然后再看本篇。原创 2022-12-17 18:58:27 · 1505 阅读 · 0 评论 -
【并发编程六】c++进程通信——信号量(semaphore)
信号量是操作系统提供的一种协调共享资源访问的方法。信号量则由操作系统进行管理,地位高于进程,操作系统保证信号量的原子性。原创 2022-11-17 23:04:18 · 7398 阅读 · 4 评论 -
【并发编程五】c++进程通信——共享内存(shared memmory)
现代操作系统,对于内存管理,采⽤的是虚拟内存技术,也就是每个进程都有⾃⼰独⽴的虚拟内存空间,不同进程的虚拟内存映射到不同的物理内存中。所以,即使进程 A中 和 进程 B中 的虚拟地址是⼀样的,其实访问的是不同的物理内存地址,对于数据的增删查改互不影响。这样这个进程写⼊的东⻄,另外⼀个进程⻢上就能看到了,都不需要拷⻉来拷⻉去,传来传去,⼤⼤提⾼了进程间通信的速度。⽤了共享内存通信⽅式,带来新的问题,那就是如果多个进程同时修改同⼀个共享内存,很有可能就冲突了。那共享内存的⽅式,就很好的解决了这⼀问题。原创 2022-11-14 21:36:20 · 8838 阅读 · 1 评论 -
【并发编程四】windows进程通信和Linux进程通信
原本写完上一篇[【并发编程三】C++进程通信(管道pipe)],就准备写消息队列的c++demo了,但是真正查找资料才发现网上都是linux下的消息队列的c++demo,就没有windows下的消息队列的进程通信的demwindows没有信号这个概念,但是会提供类似功能的api,比如,杀死进程:linux下的kill信号,windows下提供TerminateProcess的api接口。原创 2022-11-12 23:32:35 · 1716 阅读 · 0 评论 -
【并发编程三】C++进程通信——管道(pipe)
匿名管道只能用于父子进程间通信 ,不能跨网络通信,并且通信是单向。另外,管道传输的数据是⽆格式的流且⼤⼩受限。正常情况下,控制台进程的输输入出是在控制台窗口的,但是如果我们在创建子进程的时候指定了其输入输出,那么子进程就会从我们的管道读数据,把输出数据写到我们指定的管道。这就是我们代码中重定向标准输入的原因,否则system(“pause”)会无效。命名管道,顾名思义,这个管道肯定是有名字的。通过管道的名字来确保多个进程访问同一个管道。原创 2022-11-09 22:02:50 · 7728 阅读 · 1 评论 -
【并发编程一】进程、线程、协程、芊程
编写的代码只是⼀个存储在硬盘的静态⽂件,通过编译后就会⽣成⼆进制可执⾏⽂件(存储在硬盘),当我们运⾏这个可执⾏⽂件后,它会被装载到内存中,接着 CPU 会执⾏程序中的每⼀条指令,那么这个运⾏中的程序,就被称为「进程」(Process)原创 2022-10-28 23:51:15 · 1181 阅读 · 0 评论 -
【并发编程二】c++创建子进程CreateProcess()
CreatProcess()需要若干参数来指定新进程的运行方式,但实际使用中多半参数都是用不到的,可以设置为NULL。int main(int argc, char*argv[])_argc 是整型变量,argv 是指向字符串的指针数组。进程相关的API原创 2022-10-30 23:16:12 · 7907 阅读 · 2 评论