浅析信号量(Semaphore)和互斥(Mutex)

时间:2022-02-25 15:11:26
    信号量和互斥是在多线程环境中必备资源,很多网友对它都有很丰富的经验和深刻的教训。因为这篇文章不将重点于如何使用信号量或者是互斥,而是从概念上简述他们之间的一些关系。
   信号量一般有两种运用,一是所谓的binary semaphore,它的值只有0或者1,从技术角度看它可以产生类似于互斥的功能,但是它们有区别:
  • 信号量的释放不一定是已经获取信号量的线程,但是互斥的释放一定要是已经获取互斥的线程。
  • 信号量的初始值可以是0,其他线程可以通过post或者up之类的函数增加这个值,但是互斥的初始化值一定是一个有效的值。
  • 信号量一般情况下无法实现递归获取和释放,但是互斥一般有递归获取和释放。
   另外一种信号量的使用就是作为计数资源,一般而言是大于1的一个数值。当获取对应资源后,线程能够执行相应的操作,比如在生产者和消费者模型中,只有获取资源后,才能进行对应的读写操作。
   那么我们在什么情况下使用信号量或者是互斥呢?我的个人意见是对于多进程之间资源的保护,信号量的使用一般比较方便,因为如果使用互斥的话,在按照posix1标准实现的系统中,我们往往要把互斥存放在共享内存中,以便进程之间能够相互访问。如果我们运用的系统是多线程,那么互斥的使用可能更加的容易,并且相对容易调试,因为互斥的释放只能是在获取线程中,减少了线程之间的太多关联。
   上面仅仅是我个人对信号量和互斥的一个理解,里面不免会搀杂着很多的个人观点,或许还是不正确的,请网友指正!谢谢!