iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > node.js >多线程并发的特征有哪些
  • 646
分享到

多线程并发的特征有哪些

2024-04-02 19:04:59 646人浏览 八月长安
摘要

本篇内容主要讲解“多线程并发的特征有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“多线程并发的特征有哪些”吧!多线程和并发在使用c++开发的服务端程序中多线

本篇内容主要讲解“多线程并发的特征有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“多线程并发的特征有哪些”吧!

多线程和并发

在使用c++开发的服务端程序中多线程还是主流,一般来说会有个线程池来处理接收的请求,这样可以有效提供服务器的并发能力和CPU的利用率。

多线程并发的特征有哪些

但是,多线程也是一把双刃剑。

单线程模式下,一切都是那么单调而稳定,所有的资源都是自己的,我的资源我做主。

多线程模式下,一个进程下装载了多个线程,每个线程除了部分资源是独享外,多个线程对大部分系统资源是共享的。

多个线程共享的进程资源:

  • 内存

  • 文件描述符

  • 地址空间

  • 全局数据

  • ...

每个线程独享的资源:

  • 线程寄存器

  • 线程栈

  • 线程ID、错误返回码、信号屏蔽码

  • ...

多线程并发的特征有哪些

敲黑板划重点:

1.进程是系统进行资源分配和调度的基本单位,线程是CPU调度和分派的基本单位;

2.进程是线程的载体,进程有独立地址空间,所有线程共享所在进程的地址空间;

3.进程是系统资源的大股东,而线程基本上不拥有系统资源,只占用少量在运行中必不可少的资源,比如程序计数器、一组寄存器和调用栈;

同一个进程中的多个线程有点像合租,大家共用大部分资源,自己独占一小部分资源,相互影响,然而但单进程单线程就是整租,自己独占所有资源,谁也不影响。

多线程并发的特征有哪些

掌握多线程中资源共享和相互影响的特点之后,再来看看线程安全和可重入就容易很多。

多线程并发的特征有哪些

什么是线程安全

计算机中所谓的安全大多是指结果的正确且可预测性。

前面我们知道,多线程运行起来虽然可以提高并发能力,但是多个线程会共享很多资源,比如写全局数据,这种情况下就需要额外干预,否则将引发错乱的结果。

线程安全是在拥有共享数据的多条线程并行执行的进程中,可以正常且正确的执行,不会出现数据污染等意外情况,反之则称为线程不安全。

通俗一点讲,线程安全就怎么跑都不乱,线程不安全就是一跑就可能五花八门。

所以可能产生线程不安全根本原因在于:共享数据且共享数据可变。

这些共享数据包括全局变量、局部静态变量等,每个线程都可能对这个数据进行操作,并且操作结果会影响其他线程。

我们还经常提到另外一个术语:线程安全函数/线程安全类。

线程安全函数的一些特征:

  • 无任何共享的数据,都是局部数据;

  • 存在写共享数据,但是进行了加处理,可以实现多线程的同步调用;

  • 存在读但无写共享数据,无需加锁;

多线程并发的特征有哪些

从图中可以看到:

  • 同一进程内有四个工作线程;

  • 公共函数A 只执行打印操作,无论何时何线程调用,结果都是确定且正确的,因此是线程安全函数;

  • 公共函数B 使用了全局变量Count,并对其进行递增1操作,但是没有进行加锁同步处理,因此结果是不确定的,为线程不安全函数;

  • 公共函数C 使用了全局变量Factor,并对其进行递增2操作,使用了互斥锁进行同步确保结果的正确,是线程安全函数;

在编写多线程程序时,如果涉及多个线程操作一个公共函数,如果该函数本身不是线程安全的。

例如当一个函数F是线程安全函数,但是F调用线程不安全函数G时,同样需要对G进行加锁处理,否则函数F也将不安全。

在《深入理解计算机系统》一书中深入指出了线程不安全函数的分类:

  • 不保护共享产量的函数

  • 保持跨越多个调用状态的函数

  • 返回指向静态变量的指针的函数

  • 调用线程不安全函数的函数

前面介绍的几个例子大部分都是全局变量的不加锁控制相关的,还有两种就是:

  • 函数本次调用依赖于上次调用结果,也就是所谓的跨状态,典型的linux中的rand()函数;

  • 函数将结果放在一个全局的指针中,典型的gethostbyname、localtime、strtok等;

// 函数原型 struct tm * localtime(const time_t *clock);   #include <stdio.h>  #include <time.h>   int main () {   time_t rawtime;   struct tm * timeinfo;    time (&rawtime);   timeinfo = localtime (&rawtime);    return 0; }

在localtime中将结果存放在timeinfo中,这个全局变量可以被任意的线程操作,因此将引发线程不安全。

对于Linux中线程不安全的函数可以查阅:

https://man7.org/linux/man-pages/man7/pthreads.7.html

可重入函数

在理解了线程安全的相关定义和形成原因之后,我们来看下什么是可重入。

先来看看可重入的相关定义:

一个程序可以在任意时刻被中断,然后系统去执行另外一段代码,结束后又调用继续原来的子程序不会出错,则称其为可重入(reentrant或re-entrant)。

从根本上来说:

  • 可重入函数只使用自己栈上的变量,不依赖任何外部数据,可以允许有该函数的多个副本在运行,因为每个调用者产生的函数栈都是相互独立的;

  • 不可重入函数使用了一些系统资源,如果被中断的话,可能会出现问题;

可重入函数又分为两大类:

  • 显式可重入:所有函数的参数都是值传递,并且只使用本地栈变量,那么函数就是显示可重入的,无论如何调用,都是可重入的,是绝对无条件的。

  • 隐式可重入:可重入函数中的一些参数是引用传递,只有在调用线程的时候传递指向非共享数据的指针时,它才是可重入的,是相对有条件的。

可重入函数需要满足以下几个条件:

  • 函数内部不使用静态或者全局数据

  • 函数不返回静态或全局数据,数据的产生都由调用者提供

  • 不调用不可重入函数

从本质上来说,可重入函数实现了算法和数据的分离,函数内部的计算不依赖于外部,不影响也不受外部影响,是一种高效且安全的函数。

可重入函数都是线程安全函数,线程安全不一定是可重入函数。

多线程并发的特征有哪些

不可重入函数可以遵守可重入规则去改造,从而变为可重入函数。

到此,相信大家对“多线程并发的特征有哪些”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: 多线程并发的特征有哪些

本文链接: https://www.lsjlt.com/news/84321.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 多线程并发的特征有哪些
    本篇内容主要讲解“多线程并发的特征有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“多线程并发的特征有哪些”吧!多线程和并发在使用C++开发的服务端程序中多线...
    99+
    2024-04-02
  • php多线程与并发线程的区别有哪些
    PHP是一种脚本语言,不支持真正的多线程,但可以通过多进程和协程来实现类似多线程的并发操作。 并发性:多线程是指在一个程序中同时...
    99+
    2023-10-23
    php
  • html5的特征有哪些
    这篇文章主要介绍“html5的特征有哪些”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“html5的特征有哪些”文章能帮助大家解决问题。   1. 本地存储,基于H...
    99+
    2024-04-02
  • java多线程并发处理的方法有哪些
    Java提供了多种方法来实现多线程并发处理:1. 继承Thread类:通过继承Thread类,重写run()方法,并在该方法中实现需...
    99+
    2023-09-22
    java
  • android多线程并发处理的方式有哪些
    Android多线程并发处理的方式有以下几种:1. 使用Thread类:创建Thread对象,重写run()方法,在run()方法中...
    99+
    2023-09-23
    android
  • android多线程并发处理的方法有哪些
    在Android中,可以使用以下几种方法实现多线程并发处理:1. 使用Thread类:可以通过继承Thread类或使用Runnabl...
    99+
    2023-08-19
    android
  • Javascript的特征有哪些
    这篇文章给大家分享的是有关Javascript的特征有哪些的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。 “编译执行”不属于Javascript的特征...
    99+
    2024-04-02
  • linux多线程并发的处理方式有哪些
    在Linux中,有多种方式可以实现多线程并发的处理:1. 使用线程库:Linux提供了一些线程库,如POSIX线程库(pthread...
    99+
    2023-09-27
    linux
  • mfc多线程并发处理的方式有哪些
    MFC(Microsoft Foundation Classes)是一个基于C++的应用程序框架,用于开发Windows操作系统上的...
    99+
    2024-02-29
    mfc
  • PHP 多线程并发控制方法有哪些?
    php 支持多种并发控制方法,包括:线程:允许创建可同时执行的多个线程。协程:将任务分解为可并发执行的子任务。事件循环:通过监听和响应事件来实现并发。并行处理:允许同时执行多个独立任务。...
    99+
    2024-05-06
    php 多线程
  • Canvas有哪些特征
    这篇“Canvas有哪些特征”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Canvas有哪...
    99+
    2024-04-02
  • CSS的特征性有哪些
    本篇内容介绍了“CSS的特征性有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1.继承性:某些属性在定...
    99+
    2024-04-02
  • java基础中并发多线程面试题有哪些
    java基础中并发多线程面试题有哪些,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。01 什么是线程线程是操作系统...
    99+
    2024-04-02
  • 大数据的特征有哪些
    这篇文章主要介绍大数据的特征有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!大数据的显著特征不包括数据价值密度高;大数据的显著特征数据规模大、数据类型多样、数据处理速度快;大数据是指无法在一定时间范围内用常规软件...
    99+
    2023-06-06
  • Linux的功能特征有哪些
    这篇文章主要介绍“Linux的功能特征有哪些”,在日常操作中,相信很多人在Linux的功能特征有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Linux的功能特征有哪些”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-16
  • MySQL 8.0的新特征有哪些
    这篇文章主要讲解了“MySQL 8.0的新特征有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL 8.0的新特征有哪些”吧!一,对移动应用更加友...
    99+
    2024-04-02
  • Python列表的特征有哪些
    Python列表的特征主要包括以下几点:1. 有序性:Python列表是有序的,可以按照插入的顺序进行访问和操作。2. 可变性:列表...
    99+
    2023-10-11
    Python
  • MySQL事务特征有哪些
    这篇文章主要讲解了“MySQL事务特征有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“MySQL事务特征有哪些”吧!  MySQL事务特征有哪些  At...
    99+
    2024-04-02
  • 物联网有哪些特征
    本篇内容主要讲解“物联网有哪些特征”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“物联网有哪些特征”吧!物联网是三元互联网。如果说互联网是一元互联的话,移动互联网是二元互联,那物联网就是三元互联,...
    99+
    2023-06-26
  • 云主机有哪些特征
    云主机的特征有:1、采用虚拟化技术构建云端资源池,能快速部署和自由搭配资源;2、采用分布式存储系统,可扩展性好,性能和可靠性高,能实现实时多重副本容灾,能有效规避多种故障,且支持存储资源的弹性伸缩、热迁移等功能;3、支持资源弹性调配,用户可...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作