我想检查正确的互斥锁

时间:2016-04-04 19:38:46

标签: mutex

我只想查看我认为正确的答案。

Process producer {
    while(1) {
    // produce c
     lock(empty);
     lock(mutex);
     data = c;
     unlock(mutex);
    unlock(full);
     }
    }

Process consumer {
while(1) {
 lock(full);
 lock(mutex);
 c = data;
unlock(mutex);
unlock(empty);
 // consume c
 }
}

正在使用多少互斥锁?
我认为pthread_mutex_t为空,互斥,满; 这里使用了三个互斥锁。

互斥锁的初始状态是什么?

我对此一无所知。互斥锁的初始状态是什么?

这是互斥的另一个例子

Process producer {
while(1) {
 lock(mutex);
 if (count == 0){
// produce c
  data = c;
  count = 1;
}
  unlock(mutex);
  }
}

Process consumer {
while(1) {
 lock(mutex);
 if (count == 1){
  c = data;
  count = 0;
 }
unlock(mutex);
 // consume c
 }
}

在我的强项中,这段代码的问题是在锁定和忙碌等待中产生的,但我认为这很好。当某些东西进入生产者函数或消费者函数时,它具有互斥锁并将其解锁。

出了什么问题?

1 个答案:

答案 0 :(得分:0)

第一部分:

是的,伪代码使用三个互斥锁。

如果你不知道,互斥锁的初始状态是什么,也许你应该阅读更多关于互斥体,herehere或者你的课程材料(这看起来像一个学校运动)。

但要简单回答一下:当您的程序(使用互斥锁的部分)启动时,互斥锁可以锁定解锁。在这里,您使用3个互斥锁:

  1. mutex 以确保只有一个制作人或消费者同时访问data
  2. 清空以确保生产者只有在存储(由data表示)为空时才会生成
  3. 完整以确保消费者只有在存储空间已满时才会消费
  4. 当此代码启动时,您:

    1. 希望允许其中一个生产者/消费者做某事=>必须解锁互斥锁
    2. 希望制作人制作一些内容 - 假设您的存储空间在开头是空的> empty 将被解锁。
    3. 不要希望任何消费者开始消费(直到生产者制作了一些东西)=> 完整将被锁定。
    4. 第二部分:

      好吧,你的电源点是对的。这段代码完全具有它所说的问题。

      首先,它具有在锁内生成c的代码。该代码在此处由注释表示,但通常需要时间。在你的一个线程产生c期间,所有其他线程都必须等待锁定(而不是做一些有用的事情)。

      其次,它有积极的等待。如果有10个生产者和1个消费者并且已经生产了什么,会发生什么?实际上唯一可以做某事的人就是消费者,所以制片人站在角落等待会很好。但是猜猜是什么 - 他们都将争夺锁定,而且可能需要很长时间才能赢得消费者并进入关键部分。

      要明确说明,可以正常工作(您的评论是正确的)。它只是超级无效,会浪费你的CPU时间。