互斥量与信号量

2018-05-09  本文已影响12人  conowen

互斥量 (Mutex)

在计算机科学中,锁是在执行多线程时用于强行限制资源访问的同步机制。

在iOS中,实现互斥量有多种方式,一般有

@synchronized(self) {
// task
}
  NSLock *mutexLock = [[NSLock alloc] init];
  [mutexLock lock];
  //task
  [mutexLock unlock];

信号量(Semaphore)

信号量是一个同步对象,用于保持在0至指定最大值之间的一个计数值。当线程完成一次对该semaphore对象的等待(wait)时,该计数值(- 1);当线程完成一次对semaphore对象的释放(release)时,计数值(+ 1)。简单来说,信号量为0的时候,线程会阻塞,一直等待该信号量对象的计数值变成大于0的状态。

  dispatch_queue_t queue = 
  dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
  dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);//信号量初始为0
  dispatch_async(queue, ^{
      // task1
      dispatch_semaphore_signal(semaphore);// 使信号量+1并返回
  });
  dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
  // task2 
  //只有当task1执行完,信号量+1之后,才会执行这里

数值为N的信号量允许N个线程并发访问。

如果信号量是一个任意的整数,通常被称为计数信号量(Counting semaphore),或一般信号量(general semaphore);如果信号量只有二进制的0或1,称为二进制信号量(binary semaphore)。在linux系统中,二进制信号量(binary semaphore)又称互斥量(Mutex)。

所以说,互斥量和信号量本质上一样,都是用来表示对资源的访问权,但是互斥量表示资源某个时刻最多只能被一个线程占用,也就是资源计数最多是1,而信号量的资源计数可以超过1,即同时被多个线程占用。

两者对比的话,简单来说,

参考文章

https://zh.wikipedia.org/wiki/%E4%BF%A1%E8%99%9F%E6%A8%99

上一篇 下一篇

猜你喜欢

热点阅读