Concurrency 互斥和同步之间的区别?

Concurrency 互斥和同步之间的区别?,concurrency,synchronization,mutual-exclusion,Concurrency,Synchronization,Mutual Exclusion,以上两者的区别是什么 我想到这个问题是因为我发现 监视器和锁提供互斥功能 信号量和条件变量提供同步 这是真的吗 我在搜索的时候也发现了这个 请澄清。互斥意味着在任何给定时间点,只有一个线程能够访问共享资源。这避免了获取资源的线程之间的竞争条件。监视器和锁提供了执行此操作的功能 同步表示同步/命令多个线程访问共享资源。 举个例子: 如果有两个线程,线程1和线程2 线程1和线程2并行执行,但在线程1可以按顺序执行语句之前,线程2必须按顺序执行语句B。这里需要的是同步。信号量提供了这一点。您在线程1中

以上两者的区别是什么

我想到这个问题是因为我发现

  • 监视器和锁提供互斥功能

  • 信号量和条件变量提供同步

  • 这是真的吗

    我在搜索的时候也发现了这个


    请澄清。

    互斥意味着在任何给定时间点,只有一个线程能够访问共享资源。这避免了获取资源的线程之间的竞争条件。监视器和锁提供了执行此操作的功能

    同步表示同步/命令多个线程访问共享资源。
    举个例子:
    如果有两个线程,
    线程1
    线程2

    线程1
    线程2
    并行执行,但在
    线程1
    可以按顺序执行语句之前,线程2必须按顺序执行语句
    B
    。这里需要的是同步。信号量提供了这一点。您在
    线程1
    中的语句
    a
    之前放置了一个信号量等待,并在
    线程2中的语句
    B
    之后发布到信号量

    这确保了您所需的同步。

    理解差异的最佳方法是借助一个示例。下面是通过信号量解决经典生产者-消费者问题的程序。为了提供互斥,我们通常使用二进制信号量或互斥,为了提供同步,我们使用计数信号量

    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
      }
    }
    
    在上面的代码中,互斥变量提供互斥(仅允许一个线程访问关键部分),而full和empty变量用于同步(以加速各个线程之间共享资源的访问)