概念
线程安全就是在多线程运行的时候,不论线程的调度顺序怎样,最终的结果都是一样的、正确的。那么就说这些线程是安全的。
要保证线程安全需要做到:
- 对线程同步,保证同一时刻只有一个线程访问临界资源。
- 在多线程中使用线程安全的函数(可重入函数),所谓线程安全的函数指的是:如果一个 函数能被多个线程同时调用且不发生竟态条件(不出错),则我们称它是线程安全的。
下面我们来模拟,主线程分割数字字符串,子线程分割字母字符串这样一个程序:
在第二次分割时,我们没有传入要分割的字符串,而传入了NULL,是因为它会沿着上次分割的位置继续分割
运行结果如下:有点出乎意料,主程序最终也去分割字母字符串,并且并发运行还到导致多次出现字母q
产生这种问题的原因是什么呢?
strtok
这个函数不是线程安全的。
strtok
为什么可以记住上次分割的位置呢?可能是因为其内部存在一个静态的指针变量
因此两个线程在运行时,主线程运行记住2的位置后,静态变量又去指向b,于是就会开始分割字母字符串。
考虑到这一点,系统为我们设计了线程安全的版本:
我们通过传入自己设计的指针,来记忆当前分割的位置,由用户自己去维护。
修改代码如下:
正常分割