竞态条件:多个并发执行的线程或者进程访问共享资源的时候,执行的顺序不确定性导致了数据的交叉访问和竞争。
竞态条件通常出现在以下情况下:
1.共享资源的读写:多个线程同时读取和写入共享资源,可能导致数据的不一致性;
2.程序的控制流程操作:多个线程或进程在没有适当同步的情况下改变程序的控制流,可能导致意外的执行路径和结果;
3.使用了不可重入函数:多个线程同时调用一个不可重入函数,该函数依赖于共享的状态,可能导致结果的不确定性。
如果多线程环境不存在竞态条件==》可重入;存在竞态条件==》不可重入。
线程互斥:
-
mutex互斥锁
可以通过引入互斥锁来保证每一次只有一个线程能够进入临界区代码段,保证原子操作;
只有栈空间是每个线程私有的,同一个进程里面的线程是共享这个进程的堆内存的数据段(全局变量)
-
atomic原子类型
线程通信:
-
condition_variable 条件变量
生产者消费者模型:
-
semaphore 信号量
控制精度不如条件变量, 可以看作是一个资源计数没有限制的mutex互斥锁
信号量就不用像是互斥锁只有0,1变化了,它可以是1,2,3,4.。。。。。
也有二元信号量 semaphore sem(1); 资源计数0,1:可以完成和mutex互斥锁相同的线程互斥操作。但是也有区别:mutex只能是那个线程获取锁那个线程释放,sem不同,sem.wait()和sem.post()可以处在不同的线程中调用。