我只想查看我认为正确的答案。
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
}
}
在我的强项中,这段代码的问题是在锁定和忙碌等待中产生的,但我认为这很好。当某些东西进入生产者函数或消费者函数时,它具有互斥锁并将其解锁。
出了什么问题?
答案 0 :(得分:0)
是的,伪代码使用三个互斥锁。
如果你不知道,互斥锁的初始状态是什么,也许你应该阅读更多关于互斥体,here或here或者你的课程材料(这看起来像一个学校运动)。
但要简单回答一下:当您的程序(使用互斥锁的部分)启动时,互斥锁可以锁定或解锁。在这里,您使用3个互斥锁:
data
data
表示)为空时才会生成当此代码启动时,您:
好吧,你的电源点是对的。这段代码完全具有它所说的问题。
首先,它具有在锁内生成c
的代码。该代码在此处由注释表示,但通常需要时间。在你的一个线程产生c
期间,所有其他线程都必须等待锁定(而不是做一些有用的事情)。
其次,它有积极的等待。如果有10个生产者和1个消费者并且已经生产了什么,会发生什么?实际上唯一可以做某事的人就是消费者,所以制片人站在角落等待会很好。但是猜猜是什么 - 他们都将争夺锁定,而且可能需要很长时间才能赢得消费者并进入关键部分。
要明确说明,可以正常工作(您的评论是正确的)。它只是超级无效,会浪费你的CPU时间。