首页 > 其他分享 >线程安全是什么?

线程安全是什么?

时间:2024-09-29 15:50:35浏览次数:10  
标签:std 函数 什么 安全 线程 str 多线程

线程安全(Thread Safety)指的是,当多个线程并发执行某段代码时,不会出现竞态条件(Race Condition)等问题,程序能够按照预期正确运行。

一个线程安全的函数,即使在多线程环境下被多个线程同时调用,也能确保其执行的正确性,不会因为共享资源的并发访问而引发错误。

线程安全的定义

  • 线程安全的代码:能够在多线程环境下并发执行,且无需额外的同步手段(如锁),程序行为仍能保持一致和正确。
  • 线程不安全的代码:在多线程环境下执行时,可能会出现竞态条件或数据不一致问题,需要依赖额外的同步机制来确保其执行的正确性。

线程安全与线程不安全的函数

线程安全的函数特征

  1. 无共享数据:函数内部没有对全局变量、静态变量或其他共享资源的访问,或对这些资源的访问是只读的。

  2. 使用锁机制保护共享数据:对共享资源的写操作使用锁(如互斥锁 mutex)来确保同一时刻只有一个线程能修改数据。

  3. 局部变量:函数只操作局部变量,或者动态分配内存的变量,这些变量是线程私有的,不存在并发冲突。

  4. 函数的行为独立:每次调用的结果只依赖于函数的参数和返回值,不依赖外部状态。

线程不安全的函数特征

  1. 共享数据访问:函数直接访问或修改共享数据(如全局变量或静态变量)而没有保护措施。

  2. 非原子操作:执行多个操作步骤,而这些步骤不能保证在多线程环境下原子化完成。

  3. 使用不可重入的函数:这些函数在执行时会改变全局状态,不能被安全地并发调用。

常见的线程安全函数

以下是一些通常被认为是线程安全的函数和操作:

  1. 标准 I/O 函数(某些平台下):例如 printfscanf,在某些现代系统中是线程安全的,因为它们在内部使用锁来保护共享资源(例如标准输出设备)。
  2. 纯函数(Pure Functions):这些函数没有副作用,其输出仅依赖于输入参数,不会改变外部状态,例如数学函数 sqrt()sin() 等。
  3. 局部变量操作的函数:函数只使用局部变量,局部变量在栈中分配,在线程之间不共享。
  4. C++11 标准库中的线程安全容器:C++11 之后的标准库引入了一些线程安全的工具,如 std::mutexstd::atomic,这些可以帮助实现线程安全的代码。

线程安全示例

#include <cmath>

// 线程安全,因为没有全局状态,只依赖参数
double compute_square_root(double x) {
    return std::sqrt(x);
}

常见的线程不安全函数

以下是一些通常被认为是线程不安全的函数或操作:

  1. 操作全局或静态变量的函数:如果函数在多个线程间共享全局或静态变量,且没有保护这些共享资源的机制(如锁),就容易出现数据竞争和不一致问题。

  2. 使用不可重入函数:不可重入函数会改变一些全局状态,导致多线程访问时出现问题。常见的如 strtok()asctime()gmtime() 等 C 标准库函数。

  3. 操作共享资源的函数:如果一个函数对共享资源(如文件、设备、数据库等)进行操作而不加以保护,这些操作就可能在多线程环境下导致冲突。

  4. C 标准库中的一些不安全函数:如 gethostbyname()localtime() 等,它们使用了内部的静态变量,多个线程访问时可能导致数据错误。

线程不安全示例

#include <cstring>

// 线程不安全,因为 str 保存为静态变量,可能被多个线程同时访问
char* unsafe_strtok(char* str, const char* delim) {
    static char* saved_str;
    if (str) {
        saved_str = str;
    }
    // strtok 操作共享的 saved_str
    return std::strtok(saved_str, delim);
}

如何保护线程不安全的函数

对于线程不安全的函数,如果想在多线程环境中安全使用,可以通过同步机制来保护。常用的保护方法有:

  1. 使用互斥锁(mutex)

    • 对共享数据加锁,确保同一时刻只有一个线程能够访问这些资源。
    #include <iostream>
    #include <mutex>
    
    std::mutex mtx;
    int shared_data = 0;
    
    void thread_safe_function() {
        std::lock_guard<std::mutex> lock(mtx);  // 自动上锁和解锁
        // 访问共享数据
        shared_data++;
        std::cout << "Shared data: " << shared_data << std::endl;
    }
    
  2. 使用 std::atomic

    • 对基本数据类型如 intbool 使用原子操作,避免使用锁。
    #include <atomic>
    
    std::atomic<int> atomic_counter(0);
    
    void atomic_increment() {
        atomic_counter++;
    }
    
  3. 使用线程局部存储(Thread Local Storage, TLS)

    • 将变量声明为线程局部变量,确保每个线程都有独立的副本。
    thread_local int thread_local_var = 0;  // 每个线程有独立的变量副本
    

常见的线程安全函数与不安全函数对比

线程安全函数 线程不安全函数
std::atomic 相关操作 strtok
std::mutexstd::lock_guard asctime
fwritefread(多数平台上安全) gmtime
snprintf strtok_r(部分平台上)
reentrant 系列函数(如 gmtime_r gethostbyname

总结

  • 线程安全的函数可以在多线程环境下并发执行而不会导致不一致性或竞态条件。
  • 线程不安全的函数通常会在多线程环境下修改共享状态或使用全局变量,可能导致数据冲突。
  • 如果需要在多线程中使用线程不安全的函数,常用的同步机制如锁、原子操作和线程局部存储可以帮助确保线程安全。

标签:std,函数,什么,安全,线程,str,多线程
From: https://www.cnblogs.com/niumachen/p/18440165

相关文章

  • 花8000元去培训机构学习网络安全值得吗,学成后就业前景如何?
      我就是从培训机构学的网络安全,线下五六个月,当时学费不到一万,目前已成功入行。所以,只要你下决心要入这一行,过程中能好好学,那这8000就花得值~因为只要学得好,工作两个多月就能赚回学费,而且大部分培训班也会有就业支持,比如老师给推荐或者定期的招聘会…先说一下我自己,很喜欢......
  • 多线程学习
    一.认识线程(Thread)1.线程是什么定义:线程是一个轻量级的执行流,它代表了程序执行的一个路径。每个线程都有自己的程序计数器、栈和局部变量,但线程之间可以共享同一个进程的全局变量和堆。主线程:在Java程序中,main()方法所运行的线程被称为主线程(MainThread)。当你启动......
  • 红帽RHCE和RHCA有什么区别
    在红帽认证体系当中,RHCE(RedHatCertifiedEngineer)以及RHCA(RedHatCertifiedArchitect)乃是两项极具声望的高级认证。众多人士对于它们彼此之间存在的区别,深感困惑不解。接下来,IT小编将会引领大家一道深入细致地探究RHCE和RHCA认证的差异所在,助力您明晰并拣选出契合......
  • 小迪安全课程笔记-2024-十九-
    小迪安全课程笔记2024(十九)P53:第53天:XSS跨站&SVG&PDF&Flash&MXSS&UXSS&配合上传&文件添加脚本-逆风微笑的代码狗-BV1Mx4y1q7Ny好看看今天的内容啊,今天呢是这个继续讲这个夸张,那呃上节课呢已经讲了一下夸张的啊,今天呢继续讲啊,在今天讲的讲30个夸张啊,三四个其实是五个,但是有两......
  • 小迪安全课程笔记-2024-二十四-
    小迪安全课程笔记2024(二十四)P65:第66天:Java安全&SPEL表达式&SSTI模版注入&XXE&JDBC&MyBatis注入-逆风微笑的代码狗-BV1Mx4y1q7Ny没有挂机上课了啊,今天讲一下这个60由天啊,这个java安全,这个java安全的这一个系列的课程呢,大概,五六次直播吧对吧,嗯前面因为这些漏洞呢有些是讲过......
  • 小迪安全课程笔记-2024-二十-
    小迪安全课程笔记2024(二十)P55:第55天-XSS防御&HttpOnly&CSP&靶场工具等-逆风微笑的代码狗-BV1Mx4y1q7Ny其实有三个,一般这个XS2的防御的有三块,我们主要呢是讲后面这个最后一块的,这最后一块呢还有一些文章可以做啊,前面这个什么CSP的策略啊,什么hpoonly啊,虽然说也能绕过。也......
  • 小迪安全课程笔记-2024-八-
    小迪安全课程笔记2024(八)P27:第27天-PHP应用&TP框架&路由访问&对象操作&内置过滤绕过&核心漏洞-逆风微笑的代码狗-BV1Mx4y1q7Ny讲这个P1P开发的最后一讲了啊,讲了之后呢就要来到JS的开发了,PVP的最后一讲了,讲的是这个框架类的,对讲的框架呢是这个SLEPB,虽然呢他有其他的框架,但是......
  • 校园跑腿系统二手市场校园搭子校园社团活动系统2000的和4800的有什么区别
    校园跑腿系统、二手市场、校园搭子、校园社团活动系统在不同价格档位(如2000元和4800元)之间可能存在多方面的区别,这些区别主要体现在功能丰富性、技术支持、用户体验、定制化程度以及后续服务等方面。然而,由于具体的价格差异和系统提供商的不同,以下分析是基于一般情况的推测,实际......
  • 一文学会编写大模型备案安全评估报告「小白也可学会」
     文章目录一、语料安全评估        (一)评估内容        (二)评估结论二、模型安全评估三、安全措施评估四、总体结论适用于不会大模型备案过程中对大模型备案安全评估报告不会如何编写的业务人员。*图:大模型备案全套素材文件一、语料安全评估(......
  • 合天网络安全笔记-七-
    合天网络安全笔记(七)P44:第5天:WEB漏洞扫描器-AWVS及nmap-网络安全就业推荐-BV1Zu411s79i现在开充电了哦,那个麦有没有什么问题呀,可以是吧,那我们就开始上课了,刚好八点有回音吗,那我把这个窗关一下看看,现在呢现在好点没有,因为这个房间还是比较大的,哦对今天是我给大家上课。那那我......