c++ 线程间通信方式

c++ 线程间通信方式文章目录 线程同步和线程互斥 线程间通信方式 信号量 条件变量 互斥量 进程 线程 协程 多进程和多线程 线程同步和线程互斥 互斥 某一资源同时只允许一个访问者对其进行访问 具有唯一性和排它性 但互斥无法限制访问者对资源的访问顺序 即访问是无序的 线程间不需要知道彼此的存在 同步 在互斥的基础上 大多数情况 通过其它机制实现访问者对资源的有序访问 线程间知道彼此的存在 在大多数情况下

文章目录

线程同步和线程互斥

线程间通信方式

信号量、条件变量、互斥量

进程、线程、协程

多进程和多线程

线程同步和线程互斥

互斥

某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的,线程间不需要知道彼此的存在。

同步

在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问,线程间知道彼此的存在。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源

线程间通信方式

两个进程间的两个线程通信,相当于进程间通信:
信号量, socket网络连接, 共享内存 ,管道,共享文件

一个进程中的两个线程间通信方式:
1.互斥锁
mutex;
lock_guard (在构造函数里加锁,在析构函数里解锁)
unique_lock 自动加锁、解锁
atomic 基本类型的原子操作
参考链接:
std::unique_lock与std::lock_guard区别
C++11 std::unique_lock与std::lock_guard区别及多线程应用实例
C11:std::unique_lock和std::lock_guard的区别
2.条件变量condition_variable
关于互斥锁和条件变量:
互斥量可以保护共享数据的修改,如果线程正在等待共享数据的某个条件出现,仅用互斥量的话就需要反复对互斥对象锁定解锁,以检查值的变化,这样将频繁查询的效率非常低。
条件变量可以让等待共享数据条件的线程进入休眠,并在条件达成时唤醒等待线程,提供一种更高效的线程同步方式。条件变量一般和互斥锁同时使用,提供一种更高效的线程同步方式。
3.信号量
4.读写锁shared_lock。

信号量、条件变量、互斥量

1.互斥锁是为上锁而优化的;条件变量是为等待而优化的; 信号量既可用于上锁,也可用于等待,因此会有更多的开销和更高的复杂性。

2.互斥锁,条件变量都只用于同一个进程的各线程间,而信号量可用于不同进程间的同步。当信号量用于进程间同步时,要求信号量建立在共享内存区。

3.读写锁与互斥量类似,不过读写锁允许更高的并行性。读写锁也叫做共享-独占锁,当读写锁以读模式锁住时,它是以共享模式锁住的;当他以写模式锁住时,它是以独占模式锁住的。

进程、线程、协程

1.进程有自己独立的堆和栈,都不共享,是操作系统调度的基本单位

2.线程有自己独立的栈和共享的堆,是cpu调度的基本单位

3.协程有自己独立的栈和共享的堆,由程序员在代码里显示调度。

协程的优点:

没有线程切换的开销,执行销量高;

只有一个线程,共享资源不加锁。

多进程和多线程

需要频繁创建销毁的优先用线程。
web服务器。来一个建立一个线程,断了就销毁线程。要是用进程,创建和销毁的代价是很难承受的。

需要进行大量计算的优先使用线程
所谓大量计算,当然就是要消耗很多cpu,切换频繁了,这种情况先线程是最合适的。比如:图像处理、算法处理

强相关的处理用线程,弱相关的处理用进程。
一般的server需要完成如下任务:消息收发和消息处理。消息收发和消息处理就是弱相关的任务,而消息处理里面可能又分为消息解码、业务处理,这两个任务相对来说相关性就要强多了。因此消息收发和消息处理可以分进程设计,消息解码和业务处理可以分线程设计。

可能扩展到多机分布的用进程,多核分布的用线程。

编程小号
上一篇 2025-01-27 18:57
下一篇 2025-03-17 13:01

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/134953.html