互斥和同步的区别是什么?

22

以上两者有什么区别?

我之所以会想到这个问题,是因为我发现:

  1. 监视器和锁提供互斥

  2. 信号量和条件变量提供同步

这是真的吗?

在搜索过程中,我找到了这篇文章

如有任何澄清,请告知。

2个回答

30

互斥意味着在任何给定时刻只有一个线程应该能够访问共享资源。这可以避免线程之间获取资源的竞态条件。监视器和锁提供了此功能。

同步意味着您同步/排序多个线程对共享资源的访问。
考虑以下示例:
如果您有两个线程,线程1线程2
线程1线程2并行执行,但在线程1可以执行序列中的某个语句A之前,必须确保线程2在其序列中执行了语句B。在这里需要同步。信号量就提供这个功能。在线程1的语句A之前放置一个信号量等待,在线程2的语句B之后发布该信号量。
这确保了您需要的同步。


0
最好的理解方法是通过一个例子。下面是使用信号量解决经典生产者消费者问题的程序。为了提供互斥,我们通常使用二进制信号量或互斥锁,为了提供同步,我们使用计数信号量。
BufferSize = 3;

semaphore mutex = 1;              // used for mutual exclusion
semaphore empty = BufferSize;     // used for synchronization
semaphore full = 0;               // used for synchronization

Producer()
 {
  int widget;

   while (TRUE) {                  // loop forever
     make_new(widget);             // create a new widget to put in the buffer
     down(&empty);                 // decrement the empty semaphore
     down(&mutex);                 // enter critical section
     put_item(widget);             // put widget in buffer
     up(&mutex);                   // leave critical section
     up(&full);                    // increment the full semaphore
   }
 }

Consumer()
{
  int widget;

   while (TRUE) {                  // loop forever
     down(&full);                  // decrement the full semaphore
     down(&mutex);                 // enter critical section
     remove_item(widget);          // take a widget from the buffer
     up(&mutex);                   // leave critical section
     consume_item(widget);         // consume the item
  }
}

在上述代码中,mutex变量提供了互斥(只允许一个线程访问关键部分),而full和empty变量用于同步(在各个线程之间调节共享资源的访问)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接