Linux——线程安全

2023-11-03

概念

线程安全就是在多线程运行的时候,不论线程的调度顺序怎样,最终的结果都是一样的、正确的。那么就说这些线程是安全的。
要保证线程安全需要做到:

  1. 对线程同步,保证同一时刻只有一个线程访问临界资源。
  2. 在多线程中使用线程安全的函数(可重入函数),所谓线程安全的函数指的是:如果一个 函数能被多个线程同时调用且不发生竟态条件(不出错),则我们称它是线程安全的。

下面我们来模拟,主线程分割数字字符串,子线程分割字母字符串这样一个程序:
在这里插入图片描述
在第二次分割时,我们没有传入要分割的字符串,而传入了NULL,是因为它会沿着上次分割的位置继续分割
运行结果如下:有点出乎意料,主程序最终也去分割字母字符串,并且并发运行还到导致多次出现字母q在这里插入图片描述

产生这种问题的原因是什么呢?
strtok这个函数不是线程安全的。
strtok为什么可以记住上次分割的位置呢?可能是因为其内部存在一个静态的指针变量
因此两个线程在运行时,主线程运行记住2的位置后,静态变量又去指向b,于是就会开始分割字母字符串。

考虑到这一点,系统为我们设计了线程安全的版本:
在这里插入图片描述
我们通过传入自己设计的指针,来记忆当前分割的位置,由用户自己去维护。
修改代码如下:

在这里插入图片描述

正常分割
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Linux——线程安全 的相关文章

  • C++ Linux GCC 应用程序中的 GUID

    我有很多服务器运行这个 Linux 应用程序 我希望他们能够生成一个碰撞概率较低的 GUID 我确信我可以从 dev urandom 中提取 128 个字节 这可能没问题 但是有没有一种简单易用的方法来生成与 Win32 更等效的 GUID
  • grep 彩色线条

    我编写了一个简单的 PHP shell 脚本 它解析文件并输出某些元素 它产生大量的输出 采用不同的 bash 颜色 绿色表示正常 黄色表示警告 红色表示错误等 在开发过程中我想过滤掉一些行 例如 所有包含红色文本的行 我可以使用grep
  • GCC 详细模式输出解释

    我是 Linux 新手 谁能向我解释一下我的 hello world 程序的以下详细模式输出 另外 这些文件是做什么用的crt1 o crti o crtend o crtbegin o and crtn o and lc and lgcc
  • 打印 STDOUT/STDERR 并将它们写入 Bash 中的文件?

    有没有办法让 Bash 将 STDOUT STDERR 重定向到文件 但仍然将它们打印到终端 这会将 STDOUT 和 STDERR 重定向到同一个文件 some command 2 gt 1 tee file log Example to
  • EULA 接受 Bash 脚本

    我有一个尝试安装垃圾箱的脚本 除了 bin 在 more 中打开 EULA 之外 一切正常 在脚本再次开始并自行完成安装之前 您必须手动 ctrl c 退出此 more 实例 因为这更多的是逃离 shell 所以脚本在打开后不知道要运行什么
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 重新链接匿名(未链接但打开)文件

    在 Unix 中 可以创建匿名文件的句柄 例如 使用 creat 创建并打开它 然后使用 unlink 删除目录链接 留下一个带有 inode 和存储的文件 但没有可能的方法重新打开它 此类文件通常用作临时文件 通常这就是 tmpfile
  • 为什么我的代码在编译用于分析 (-pg) 时在多线程下运行比在单线程下运行慢?

    我正在写一个光线追踪器 最近 我在程序中添加了线程 以利用 i5 四核上的附加内核 奇怪的是 应用程序的调试版本现在运行速度变慢 但优化后的构建运行速度比添加线程之前更快 我将 g pg 标志传递给 gcc 以进行调试构建 并将 O3 标志
  • sudo pip install python-Levenshtein 失败,错误代码 1

    我正在尝试在 Linux 上安装 python Levenshtein 库 但每当我尝试通过以下方式安装它时 sudo pip install python Levenshtein 我收到此错误 命令 usr bin python c 导入
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 路由是否会影响具有绑定源地址的套接字?

    假设我有两个网络接口 eth0有地址10 0 0 1 eth1有地址192 168 0 1 Using route or ip route add我已将其设置为路由 所有地址至eth0 1 2 3 4只为了eth1 所以数据包到1 2 3
  • 在bash中用其他文件过滤一个文件

    我有一个带有数字的文件 例如 cat file 31038467 32048169 33058564 34088662 35093964 31018168 31138061 31208369 31538163 31798862 和其他例如
  • 如何从 Linux 命令行确定 LCD 显示器是否打开

    如何通过 Linux 命令行判断计算机的显示器是否打开 关闭 我传统上认为显示器是仅输出的设备 但我注意到 Gnome 显示器首选项对话框具有 检测显示器 功能 这可以推广到确定显示器是否物理关闭吗 VESA DDC 连接是I2C http
  • python 可以检测它运行在哪个操作系统下吗?

    python 可以检测操作系统 然后为文件系统构建 if else 语句吗 我需要将 Fn 字符串中的 C CobaltRCX 替换为 FileSys 字符串 import os path csv from time import strf
  • bash "&" 不打印 "[1]+ Done "

    我在 bashrc 中调用一个脚本来打印打开终端时收到的新消息数 我希望该调用在访问网络时是非阻塞的 有时需要几秒钟 这意味着我无法使用终端直到完成 但是如果我输入 mailcheck 在我的 bashrc 中 它工作正常 但然后打印一个空
  • 将 bash 脚本作为守护进程运行

    我有一个脚本 它每 X 次运行我的 PHP 脚本 bin bash while true do usr bin php f my script php echo Waiting sleep 3 done 我怎样才能将它作为守护进程启动 要从
  • 如何从命令行执行 PHP 代码?

    我想执行单个 PHP 语句 例如if function exists my func echo function exists 直接使用命令行 无需使用单独的 PHP 文件 这怎么可能 如果您要在命令行中执行 PHP 我建议您安装phpsh
  • 如何防止 CMake 在构建时(而不是安装时)为共享库创建符号链接?

    我正在使用 CMake 在 Linux 上使用 Bullet3 构建一个项目 在构建整个解决方案时 它会构建附加了 SOVERSION 的 Bullet 输出库 并创建一个不带版本的符号链接 对于我的特定场景 我不喜欢这种行为 并且我不想编
  • 从sourceforge下载最新版本

    我正在尝试在 bash 脚本中从 Sourceforge 下载最新版本的graphicsmagick wget q https sourceforge net projects graphicsmagick files latest dow
  • shell中基于正则表达式的颜色突出显示输出

    我想知道是否可以用颜色突出显示与某些字符串匹配的 shell 命令的输出 例如 如果我运行 myCommand 输出如下 gt myCommand DEBUG foo bar INFO bla bla ERROR yak yak 我希望所有

随机推荐

  • 兜兜转转,2020已过半

    兜兜转转间 这个开局有些艰难的2020就已经过半了 这些日子 你过得还好吗 不管是努力抵抗病痛 还是奋力工作生活 其实一直以来 我们都在路上 摸爬滚打 艰难前行 我们总是在追寻 在求索 为了所爱的人 而默默付出努力 却仍时时觉得对不起他们
  • Android中使用Notification实现应用更新显示下载进度

    公司项目马上要进入内测阶段了 检查的时候发现还差一个更新的功能没有做 IOS那边儿有AppStore Android可没有 虽然说各大应用市场也会推送吧 但是毕竟还要装个XX应用市场的软件不是 要是没装的话应用不就没法更新了么 考虑到这方面
  • 初学者C++面向对象程序设计概念全总结最全的概念总结

    1 对象和类概念 对象 任何一个对象都应该具备两个要素 属性 行为 在C 中每个对象都有数据 体现了 属性 和函数 用来对数据进行操作 以实现某些功能 两部分组成 类 具有共性的实体的抽象 类是对象的抽象 不占有内存 对象是类的特例 即类的
  • 深度学习算法研发工程师笔试题(百度2014校园招聘)

    一 简答题 1 深度神经网络目前有哪些成功的应用 简述原因 10分 2 列举不同进程共享数据的方式 至少三种 10分 3 对于N个样本 每个样本为D维向量 采用欧式距离使用KNN做类预测 10分 1 给出预测时间复杂度 2 当N很大时 有哪
  • -20dB谱宽是什么意思?

    20dB谱宽就是信号衰减到十分之一时的频谱带宽 dB的含义 1 dB基本上是一个比例数值 也就是一种倍数的表示单位 也就是测试数据与参考标准的相对差异表示 2 计算公式上 dB 10lg P1 P2 20 lg V1 V2 P代表功率 V代
  • 凌思微新建定时器任务

    凌思微蓝牙IC LE5010A加入自己的APP循环任务 include builtin timer h define UART EVENT PERIOD 1000 MIN 10MS UINT 1MS static void ls user
  • Go开发学习

    欢迎关注 全栈工程师修炼指南 公众号 点击 下方卡片 即可关注我哟 设为 星标 每天带你 基础入门 到 进阶实践 再到 放弃学习 花开堪折直须折 莫待无花空折枝 作者主页 https www weiyigeek top 博客 https b
  • 基于改进人工蜂群算法的 K 均值聚类算法(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章讲解 1 概述 复现论文 基于以上三点改进提出
  • VUE +Element 实现多个字段值拼接

    效果截图 VUE 核心功能代码片段 获取公共通知列表 getUsers let para page this page title this filters title this listLoading true NProgress sta
  • React 在 styled-components 中使用 TailwindCss

    方法1 推荐 编译 apply 编译 Styled Components 中的 apply 将 tailwind 编译为 普通css 支持 tailwind 和 windi Babel https github com JiangWeixi
  • RSA加密算法(公钥+私钥加密)

    公开密钥加密 公开密钥加密 public key cryptography 也成为非对称加密 是密码学的一种算法 他需要两个密钥 一个是公开密钥 另一个是私有密钥 一个用作加密的时候 另一个则用作解密 明文 需要加密的内容 成为明文 密文
  • CDN原理简介

    CDN原理简介 CDN的百度百科的解释为 CDN的全称是Content Delivery Network 即内容分发网络 其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节 使内容传输的更快 更稳定 通过在网络各处放置
  • hive执行计划解析

    文章目录 1 hive执行流程的重要性 2 解析sql执行计划流程 2 1 大数据两类sql框架 2 2 解析sql执行计划流程详解 3 sql执行计划映射MR流程 3 1过滤类查询sql 3 2分组聚合类查询sql 3 3join类查询s
  • 读取和写入文本文件

    读取和写入文本文件 Read a Text File 的这篇文章部分描述如何使用 StreamReader 类来读取文本的文件 Write a Text File Example 1 和 Write a Text File Example
  • 上传图片到七牛云

    1 首先我们需要先创建七牛云账号 并完成认证 七牛云 一站式场景化智能视频云 2 创建自己的存储空间 第一步 点击对象存储kodo 2 进入后点击空间管理 3 创建自己的存储空间 需要注意访问控制要选择公开 4 进入个人中心 gt 密钥管理
  • ImportError: cannot import name ‘XXXA‘ from ‘XXXB‘

    ImportError cannot import name XXXA from XXXB 废话不多说直接看问题 废话不多说直接看问题 ImportError cannot import name XXXa from XXXB 当你排除拼写
  • 四阶行列式直接展开_01行列式的定义上海交大

    本文文字和图片非原创 来源如下 强烈推荐原视频 作者 上海交通大学 知名教授 蒋启芬 高云 崔振等 平台 网易公开课 内容 线性代数 第一讲 行列式的定义 序言 对二元一次方程组 几何意义 平面上的两条动直线 通过加减消元可以变形到下边这种
  • 如何将本地项目上传至Gitee仓库(详细教程)

    码云 Gitee 简单介绍 Git 是一个开源的分布式版本控制系统 用于敏捷高效地处理任何或小或大的项目 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件 Git 与常用的版本控
  • C++-函数模板特化如何避免重复定义

    我正在用一个基于模板的库源代码 该库包含一些针对特定类型的模板函数特化 类模板 函数模板和模板函数特化都在头文件中 我在我的 cpp文件中 include 头文件并编译链接工程 但是为了在整个工程中使用该库 我将头文件包含在 stdafx
  • Linux——线程安全

    概念 线程安全就是在多线程运行的时候 不论线程的调度顺序怎样 最终的结果都是一样的 正确的 那么就说这些线程是安全的 要保证线程安全需要做到 对线程同步 保证同一时刻只有一个线程访问临界资源 在多线程中使用线程安全的函数 可重入函数 所谓线