【Linux系统】线程安全与死锁问题

发布时间:2026/7/16 22:29:50

【Linux系统】线程安全与死锁问题 线程安全与重入问题概念线程安全就是多个线程在访问共享资源时能够正确的执行不会相互干扰或破坏彼此的执行结果。一般情况下多个线程并发访问一段只有局部变量的代码时不会出现不同的结果。但是对全局变量或静态变量而言在没有锁保护的前提下很容易出现问题。重入同一个函数被不同的执行流调用当一个执行流还没有执行完这个函数另一个执行流就开始执行了这个函数我们称之为重入既一个函数多个执行流同时调用。当重入后函数的运行结果不会出现问题我们称做可重入函数。反之为不可重入函数。常见线程不安全情况不保护共享变量的函数 函数状态随着被调用状态发生变化的函数 返回指向静态变量指针的函数 调用线程不安全函数的函数常见不可重入的情况调用了malloc/free函数因为malloc函数是用全局链表来管理堆的 调用了标准IO库函数标准IO库的函数很多都是以不可重入的方式设计的 在可重入函数中使用了静态的数据结构总结函数是可重入的那就是线程安全的而线程是安全的其函数不一定是可重入的。思考STL的是否线程安全不安全。因为STL的设计初衷就是堆性能极致的开发而一旦涉及到加锁保证安全的环节其性能就会大打折扣所以STL是默认是不安全的。在多线程的环境下需要我们自己来保证安全。智能指针是否安全安全。对于unique_ptr由于只在当前的代码块中生效所以不涉及到线程安全问题。对于shared_ptr多个对象需要共用一个引用计数所以会存在线程安全的问题。但是标准库在实现时考虑到了这个问题让share_ptr的引用计数采用原子性的计数方式解决了这一问题。死锁问题死锁指在一组进程中的各个进程均占用不会释放的资源但因互相申请被其他进程不会释放的资源而处于一种永久等待的状态。申请一把锁是原子的但申请两把锁是就不一定了。当线程之间互相申请对方持有的锁但不释放自己的锁时就会造成死锁问题。线程A申请线程B时B一直不释放A将会一直进行等待。同样的线程B申请线程AA一直不释放B也会一直进行等待。于是线程AB都陷入了一直的等待中。

相关新闻