当前位置: 首页 > news >正文

【Linux】线程安全

线程安全:在多线程运行的时候,不论线程的调度顺序怎样,最终的结果都是 一样的、正确的,这个线程就是安全的。

 保证线程安全的要求

1. 对线程同步,保证同一时刻只有一个线程访问临界资源。

2.在多线程中使用线程安全的函数(可重入函数)。

线程安全的函数:一个函数能被多个线程同时调用且不发生竟态条件。

 不是线程安全的例子:

主线程分割字符串1 2 3 4 5 6

另一个线程分割字符串a b c d e f

#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<stdlib.h>
#include<pthread.h>void* fun(void*arg)
{char buff[128] = "a b c d e f";char*s = strtok(buff," ");while(s!=NULL){printf("fun =%s\n",s);sleep(1);s = strtok(NULL," ");}
}
int main()
{pthread_t id;pthread_create(&id,NULL,fun,NULL);char arr[128] = "1 2 3 4 5 6";char*p = strtok(arr," ");while(p!=NULL){printf("main p = %s\n",p);sleep(1);p = strtok(NULL," ");}
}

结果并没有输出main p = 2 3 4 5 6 ,这是因为多线程静态变量只有一份,无法分别记录信息,分割的东西会被覆盖,strtok方法中有静态变量记录分割后指向。

char *__cdecl strtok(char *_String, const char *_Delimiter)

 而使用strtok_s()可以保证线程安全

strtok_s()函数的原型如下:

char *__cdecl strtok_s(char *_String, const char *_Delimiter, char **_Context)

        _Context参数相当于strtok()函数中内部定义的静态SAVE_PTR指针,用来传递对字符串_String的处理进行到了哪里。 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <pthread.h>void* fun(void *arg)
{char buff[128] = "a b c d e f";char * ptr = NULL;char * s = strtok_r(buff," ",&ptr);while( s != NULL ){printf("fun s=%s\n",s);sleep(1);s = strtok_r(NULL," ",&ptr);}
}
int main()
{pthread_t id;pthread_create(&id,NULL,fun,NULL);char arr[128] = "1 2 3 4 5 6";char * ptr = NULL;char * p = strtok_r(arr," ",&ptr);while( p != NULL ){printf("main p=%s\n",p);sleep(1);p = strtok_r(NULL," ",&ptr);}pthread_join(id,NULL);exit(0);
}

结果:分割互不干扰 

        所以使用的函数有静态变量时需要使用其改进函数,保证线程安全。

相关文章:

【Linux】线程安全

线程安全&#xff1a;在多线程运行的时候&#xff0c;不论线程的调度顺序怎样&#xff0c;最终的结果都是 一样的、正确的&#xff0c;这个线程就是安全的。 保证线程安全的要求&#xff1a; 1. 对线程同步&#xff0c;保证同一时刻只有一个线程访问临界资源。 2.在多线程中使用…...

Redis-mysql 缓存实战

本文基于Springboot&#xff0c;mybatis plus&#xff0c;mysql&#xff0c;redis&#xff0c; Jedis模拟redis缓存实现 目录 1. 添加所需maven依赖 2. 设置数据库及数据表 3. 构建实体类 4. 构建工具类实现 redis 数据库连接池&#xff0c;redis 的读取&#xff0c;写入功…...

蓝桥杯:通电

蓝桥杯&#xff1a; 通电https://www.lanqiao.cn/problems/162/learning/ 目录 题目描述 输入描述 输出描述 输入输出样例 输入 输出 题目分析(最小生成树)&#xff1a; AC代码(Java) 题目描述 2015 年&#xff0c;全中国实现了户户通电。作为一名电力建设者&#xff0…...

一文搞懂 Kubernetes 的 Limits 和 Requests

当在Kubernetes中使用容器时&#xff0c;重要的是要知道所涉及的资源是什么以及如何需要它们。有些进程比其他进程需要更多的CPU或内存。有些是关键的&#xff0c;不应该被饿死。知道了这一点&#xff0c;我们应该正确配置我们的容器和Pod&#xff0c;以获得两者的最佳效果。在…...

【C++】手撕红黑树

文章目录前言一、红黑树的概念二、红黑树的节点结构三、红黑树的插入四、红黑树的调整1、叔叔存在且为红2、叔叔不存在或存在且为黑3、插入完整代码4、总结五、红黑树的验证六、红黑树的删除七、红黑树与 AVL 树的比较八、红黑树的代码实现前言 在网络上流传着这样一张图片&am…...

Java中的CAS实现原理

文章目录一、什么是CAS&#xff1f;二、JAVA中如何实现CAS操作三、CAS在JUC中的运用四、ABA问题一、什么是CAS&#xff1f; 在计算机科学中&#xff0c;比较和交换&#xff08;Conmpare And Swap&#xff09;是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行…...

什么是华为云对象存储OBS?它有什么优势?

华为对象存储OBS&#xff08;Object Storage Service&#xff09;是一种高可用、高可靠、高性能的云存储服务&#xff0c;能够为企业和个人用户提供强大的数据存储和管理功能。本文将对华为对象存储OBS的特点、优势和未来发展进行详细介绍。 一、华为对象存储OBS的特点 1.对象…...

你知道照片怎么变清晰吗?增强照片清晰度的方法

相信很多小伙伴都会有这种的经历&#xff0c;去游玩时高高兴兴的拍照留念&#xff0c;结果拍出来的照片不是很尽人意。或者是画面还没聚焦好&#xff0c;就按下快门&#xff0c;导致拍摄出来的照片变模糊了。很多小伙伴遇到这种情况都很烦恼&#xff0c;照片丢了可惜&#xff0…...

NOIP模拟赛 轰炸(bomb)

题目描述 有nnn座城市&#xff0c;城市之间建立了mmm条有向的地下通道。 你需要发起若干轮轰炸&#xff0c;每轮可以轰炸任意多的城市。但在每次轰炸城市中&#xff0c;不能同时存在两个城市i,ji,ji,j满足可以通过地下通道从城市iii到达城市jjj。你需要求出最少需要多少轮可以…...

Linux系统之安装PHP环境

Linux系统之安装PHP环境 一、PHP介绍1.PHP简介2.PHP优势3.php7版本特点二、本地环境介绍1.环境规划2.检查操作系统版本3.检查当前yum仓库三、安装PHP5.4版本1.查看可安装php版本2.使用yum安装php3.安装httpd服务4.关闭selinux和设置防火墙5.编辑index.php测试文件6.测试php环境…...

MySQL8的安装教程

MySQL8的安装教程 1.安装包的下载 如果不想去官网下载的话可以去百度网盘进行下载。 MySQL :: Download MySQL Community Server mysql-8.0.28-winx64.zip_免费高速下载|百度网盘-分享无限制 (baidu.com) 提取码&#xff1a;0001 2.解压 3.创建一个my.ini的文件 最好是创建…...

日入500+的程序员都在用的“接私活”平台

网上总说程序员的薪资很高&#xff0c;这我可就不同意了&#xff1a; 程序员的薪资哪里是很高&#xff0c;而是非常高&#xff01;而会接私活的程序员更是能拿到更高的收入&#xff01;作为一个程序员&#xff0c;这些接私活的网站一定要收藏起来&#xff0c;让你在“八小时外…...

MySQL表设计思路(一对多、多对多...)

要开始单独负责需求了&#xff0c;捋一捋表设计的思路。 文章目录一、MySQL中的数据类型二、一对一的关系设计二、一对多的关系设计三、多对多的关系设计四、经验总结一、MySQL中的数据类型 字符串类型 varchar&#xff1a;即variable char &#xff0c;可边长度的字符串&#…...

内存对齐:C/C++编程中的重要性和技巧

C/C中的内存对齐前言基本概念 什么是内存对齐&#xff1f;内存对齐的定义内存对齐的作用数据类型的大小ARM 64 位架构和 x86_64 架构下的数据类型大小ARM 32 位架构下的数据类型大小内存对齐的边界填充字节的作用内存对齐的原理结构体中的内存对齐结构体的定义和使用结构体中成…...

C++ Primer第五版_第七章习题答案(41~50)

文章目录练习7.411、头文件2、源文件3、主函数练习7.42练习7.43练习7.44练习7.45练习7.46练习7.47练习7.48练习7.49练习7.50练习7.41 使用委托构造函数重新编写你的Sales_data 类&#xff0c;给每个构造函数体添加一条语句&#xff0c;令其一旦执行就打印一条信息。用各种可能的…...

python玄阶斗技--NumPy入门

目录 一.NumPy介绍 二.创建数组 1.一维数组创建 2.二维数组创建 3.zeros函数 4.ones函数 5.empty函数 6.arange函数 三.NumPy的数学操作 1.基本运算 2.矩阵运算 3.ndarray类的方法 四.数组堆叠 五.数组分隔 一.NumPy介绍 在这里对NumPy的介绍我不想扯太多&#xf…...

VR黑科技丨远离拥挤,VR直播开启沉浸式赏樱新姿势

春光兮婉转&#xff0c;珞樱兮盛绽&#xff0c;又是一年樱花季&#xff0c;全国各地大部分地区的樱花进入盛花期&#xff0c;尤其是武汉&#xff0c;东湖樱园踏青赏花的游人如织、摩肩擦踵&#xff0c;勾勒一幅“人人人人人人人花人人人人人”的盛景。 为了一睹樱花“芳容”&am…...

ts的一些用法

1.交叉类型 & ---多个类型属性的集合 1.1类型别名实现 type Person {name:string} type Children Person & {age:number} let newPerson:Children {// name:hahah,name:hhaah,age:18 } 1.2 接口类型实现 interface Inter1{name:string } interface Inter2{name:…...

云计算面试总结

shell脚本对日志进行备份 shell 对日志备份 #!/bin/bash if [ -d /log/bak/ ] || mkdir -p /log/bak/ thentar Pcf /log/bak/log_$(date %Y%m%d)$(date %H%M%S).tar.gz /var/log/*.logecho "干完&#xff01;可以约会啦" fi存在的问题&#xff1a; 说的太快&a…...

(DP)买不到的数目【蓝桥杯】(裴蜀定理)

买不到的数目 小明开了一家糖果店。 他别出心裁&#xff1a;把水果糖包成4颗一包和7颗一包的两种。 糖果不能拆包卖。 小朋友来买糖的时候&#xff0c;他就用这两种包装来组合。 当然有些糖果数目是无法组合出来的&#xff0c;比如要买 10 颗糖。 你可以用计算机测试一下&#…...

手机数据导出

在数字信息爆炸的时代&#xff0c;手机早已不仅是通讯工具&#xff0c;更是承载个人记忆、工作文件与生活轨迹的“数字器官”。然而&#xff0c;当意外发生——误删、系统崩溃、硬件损坏——手机数据导出便成为一项技术性极高、且充满情感救赎价值的系统工程。本文将围绕手机数…...

Midjourney 2026将取消/imagine?不,它正悄悄部署「自然语言-图像-3D资产」三合一原生工作流(附实测对比数据)

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;Midjourney 2026战略转向&#xff1a;从文本生成图像到原生三维资产创作范式跃迁 Midjourney 在 2026 年正式终止对纯 2D 图像输出的默认支持&#xff0c;全面启用 v6.5 “Tesseract” 引擎&#xff0c…...

从零基础到AI大模型高手,自学AI大模型学习路线推荐,不走弯路!

本文提供了一条详尽的AI大模型自学路线&#xff0c;旨在帮助新手小白系统学习。路线涵盖数学与编程基础、机器学习入门、深度学习深入、大模型探索、进阶与应用以及社区与资源等多个方面。内容详细列出了各阶段的学习资源&#xff0c;包括经典书籍、在线课程、实践项目等&#…...

can消息的大小端对源码的影响

下图为小端intel型信号&#xff0c;其dbc文件部分源码为&#xff1a;BO_ 1 id_0x1: 8 Vector__XXXSG_ aaa : 0|121 (1,0) [0|0] "" Vector__XXX&#xff0c;这里的0代表的是起始位置为0&#xff08;起始0->7,8->12为高位)如果将该信号改为大端motorola型&#…...

【研报 A114】2026人工智能时代企业技能管理数字化转型白皮书:AI驱动全生命周期闭环,迭代速度提升70%

摘要&#xff1a;智能汽车产业加速升级&#xff0c;车企正面临员工技能迭代的核心挑战&#xff0c;AI 原生技能管理成为转型关键。依托生成式 AI、多智能体等技术&#xff0c;全新的技能管理体系贯穿技能梳理、培养、评估、应用全生命周期&#xff0c;将技能转化为车企的核心无…...

告别龟速下载!实测对比Axel、Aria2、mwget三大神器,教你选对多线程工具

三大命令行下载神器深度横评&#xff1a;Axel、Aria2与mwget的性能对决 当你在终端里反复输入wget或curl命令&#xff0c;盯着缓慢增长的进度条时&#xff0c;是否想过还有更高效的解决方案&#xff1f;本文将带你深入探索Axel、Aria2和mwget这三款命令行下载加速工具&#xff…...

C# 从零开发 MCP 工具基础教程

在C#编程领域&#xff0c;MCP&#xff08;Managed Code Programming&#xff0c;托管代码编程&#xff09;工具能极大提升开发效率与代码管理能力。无论是代码分析、自动化构建&#xff0c;还是调试辅助&#xff0c;一款实用的MCP工具都能成为开发者的得力助手。本教程将带你从…...

SkillSync MCP:为AI技能市场构建自动化安全门禁系统

1. 项目概述&#xff1a;为AI技能市场装上“安全门” 如果你和我一样&#xff0c;是Claude Code、Cursor这类AI编程助手的深度用户&#xff0c;那你一定对“技能”&#xff08;Skills&#xff09;这个概念不陌生。简单来说&#xff0c;技能就是一些预定义的提示词模板或工具脚…...

计算机视觉数据集选型实战指南:从COCO到Roboflow的工程决策框架

1. 这份清单不是“资料库目录”&#xff0c;而是计算机视觉工程师的实战弹药箱如果你正在训练一个能识别工业零件表面微小划痕的模型&#xff0c;却在COCO数据集上反复调参&#xff1b;或者你刚拿到一批医院提供的CT影像&#xff0c;第一反应是去Kaggle搜“medical image datas…...

风机技术演进与主动冷却系统优化实践

1. 风机技术演进与主动空气冷却系统优化作为一名在热管理领域工作多年的工程师&#xff0c;我见证了风机技术从简单的散热部件发展为精密的热管理系统的全过程。现代电子设备功率密度不断提升&#xff0c;从智能手机到数据中心服务器&#xff0c;散热设计已成为产品成败的关键因…...