嵌入式八股,什么是线程安全
线程安全是指在多线程环境中,一个程序或代码段能够正确地处理多个线程同时访问和操作共享资源的情况,而不会导致数据错误、程序崩溃或其他不可预期的行为。
在多线程程序中,多个线程可能会同时访问和修改共享资源(如变量、数据结构等)。如果不对这些访问和修改进行适当的控制,可能会出现以下问题:
-
数据竞争(Race Condition):多个线程同时修改同一个变量,导致最终结果不确定。例如,两个线程同时对一个整数变量进行加1操作,最终的结果可能不是预期的加2。
-
内存一致性错误(Memory Consistency Error):线程读取到的变量值不是最新的,因为其他线程对变量的修改尚未被当前线程感知到。
-
死锁(Deadlock):多个线程互相等待对方释放资源,导致程序无法继续执行。
简单来说,我们都知道线程共享一个进程的内存,要防止出现资源竞争。
具体做法,通常需要采用以下机制:
-
互斥锁(Mutex):通过锁机制确保同一时间只有一个线程可以访问共享资源。例如,在C++中可以使用
std::mutex
,在之前的线程池里有用过。 -
原子操作(Atomic Operations):确保对共享资源的操作是不可分割的。例如,C++中的
std::atomic
类型可以保证对变量的读写操作是原子的。 -
不可变对象(Immutable Objects):如果一个对象在创建后其状态不再改变,那么多个线程访问该对象时不会出现线程安全问题。比如常量
-
线程局部存储(Thread Local Storage):为每个线程提供独立的变量副本,避免线程之间的数据共享。例如,C++中的
thread_local
关键字可以实现线程局部存储。