【Tip】线程安全与可重入函数

2019/06/19 Linux

并发与并行

并发是有多个任务线程轮询执行;并行是多个线程在多核CPU上同时执行。

一般并发就是指在单核上,多个线程交替执行,即某一个时间上只可能有一个线程在执行。并行充分利用了多核的优势,同一时间能够执行多个线程。并行一般能比并发有更好执行效率,但考虑到同步、锁、上下文切换等机制的影响,而且并行性能还与核数和线程数有关。所以写并行程序需要投入更多精力。

并行程序是并发程序的一部分。

线程不安全

知道什么是线程不安全的函数,我们也就知道了线程安全的含义。

  1. 不保护共享变量的函数:这个应该比较好理解,共享的需要互斥/锁。
  2. 前后调用状态对函数有影响:举个简单的例子,rand函数隐含一个随机数种子的参数,所以你每次调用的时候能够得到不同的随机值,它依赖于前次调用时生成的随机数种子。也就是多线程调用这个函数会得到很难得到统一的结果,显然不能说它有安全性。大部分系统调用中的不安全函数都已经有相应的线程安全版本了。像rand函数的线程安全版本为rand_r(unsigned *seed),其中种子时作为传参使用的。
  3. 返回静态变量指针的函数:典型的如gethostbyname函数,返回的是一个静态变量指针。目前网路编程中已不建议用此函数了,可使用其他替代函数如getaddrinfo()
  4. 调用线程不安全函数的函数。

可重入函数(reentrant function)

这是一类线程安全的函数,不会引用任何共享数据。所以它比不可重入的线程安全函数更高效。可重入函数属于线程安全函数的一部分,二者不能划等号。

Search

    Table of Contents