c++ 线程间通信方式「建议收藏」

c++ 线程间通信方式「建议收藏」线程同步和线程互斥互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的,线程间不需要知道彼此的存在。同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问,线程间知道彼此的存在。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源线程…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

线程同步和线程互斥

  • 互斥

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

  • 同步

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

线程间通信方式

  • 两个进程间的两个线程通信,相当于进程间通信:
    信号量, 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需要完成如下任务:消息收发和消息处理。消息收发和消息处理就是弱相关的任务,而消息处理里面可能又分为消息解码、业务处理,这两个任务相对来说相关性就要强多了。因此消息收发和消息处理可以分进程设计,消息解码和业务处理可以分线程设计。
  • 可能扩展到多机分布的用进程,多核分布的用线程。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184988.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Markdown基本语法

    Markdown基本语法

    2021年11月5日
    43
  • 微信之夜,张小龙说视频化表达将会成为下一个十年内容领域的主题

    微信之夜,张小龙说视频化表达将会成为下一个十年内容领域的主题因为疫情,今年微信的公开课Pro和开发者倍加关注的微信之夜放到了线上举行,微信之父,腾讯高级执行副总裁、微信事业群总裁张小龙的微信之夜直播,更是用今天他在演讲中反复提及的视频号进行直播,将今天的活动推向高潮。

    2022年5月15日
    37
  • 你真的懂Java怎么输出Hello World吗?「建议收藏」

    你真的懂Java怎么输出HelloWorld吗?1.你会不会输出”HelloWorld!”?2.小生抛砖引玉,欢迎指正3.总结1.你会不会输出”HelloWorld!”?当我们学习一门编程语言的时候,我们都会先学如何输出HelloWorld!????:“你真的会吗?”????:“会!”????:“以下这几个例子,我背都给你背下来!!!!”【骄傲】C语言printf(“HelloWorld!”);C++语言cout<<“HelloWorld!”;

    2022年4月15日
    93
  • Java Random.nextInt()方法原理解析[通俗易懂]

    Java Random.nextInt()方法原理解析[通俗易懂]JavaRandom.nextInt()方法原理解析主要介绍了JavaRandom.nextInt()方法原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下licintnextInt(intn)该方法的作用是生成一个随机的int值,该值介于[0,n)的区间,也就是0到n之间的随机int值,包含0而不包含n。关于Randomr=newRandom(47)中47的意思今天看Java编程思想的时候看到了一段这样的代码:Rand

    2022年7月21日
    15
  • 简单的爬取百度图片,一页

    简单的爬取百度图片,一页

    2021年9月17日
    49
  • wing是什么_最短路径floyd算法例题

    wing是什么_最短路径floyd算法例题给定一个由 n 行数字组成的数字梯形如下图所示。梯形的第一行有 m 个数字。从梯形的顶部的 m 个数字开始,在每个数字处可以沿左下或右下方向移动,形成一条从梯形的顶至底的路径。规则 1:从梯形的顶至底的 m 条路径互不相交。规则 2:从梯形的顶至底的 m 条路径仅在数字结点处相交。规则 3:从梯形的顶至底的 m 条路径允许在数字结点相交或边相交。对于给定的数字梯形,分别按照规则 1,规则 2,和规则 3 计算出从梯形的顶至底的 m 条路径,使这 m 条路径经过的数字总和最大。输入格式第 1

    2022年8月9日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号