在linux多线程环境下对同一变量进行读写时,经常会遇到读写的原子性问题,即会出现竞争条件。为了解决多个线程对同一变量访问时的竞争条件问题,操作系统层面提供了锁、信号量、条件变量等几种线程同步机制。如果对变量的每次访问都使用上述机制,由于系统调用会陷入内核空间,需要频繁的进行上下文切换,这就导致了程序的时间开销比较大。
自然的,我们就想到,在多线程环境中,在某些情况下是否能减少甚至避免使用系统调用?答案是肯定的。
如果对多线程下的变量访问进行分析,可以看到,线程对变量的访问可以分为以下几类:
一个线程写,另一个线程读,简称一写一读
多个线程写,一个线程读,简称多写一读
一个线程写,多个线程读,简称一写多读。
多个线程写,多个线程读,简称多写多读。
在linux 系统中,多个线程同时读一个变量是不需要同步的,而多个线程同时写一个变量或一个线程写而其他线程读某个变量,是需要同步的,可以总结为:”多读不互斥,而读写和多写互斥“。
由于多个线程对同一变量的读不需要同步,因而一写多读和一写一读并无本质区别,进而可以把多线