Re: Порядок захвата mutex'ов.
- From
- mitrohin a.s. ()
- To
- Anton Petrusevich ()
- Date
- 2003-05-29T15:01:10Z
- Area
- RU.UNIX.PROG
From: "mitrohin a.s." <swp@uni-altai.ru>
Anton Petrusevich <casus@att-ltd.biz> wrote:
AP> mitrohin a.s. wrote:
>> imho имелось ввиду что поток проснется, но застрянет внутри cond_wait() на
>> захвате mutex.
AP> А я его не захватывал ваще. Смотри:
AP> тред1: лок, вэйт, анлок
AP> тред2: сигнал
AP> синхронизация была сделана другими сигналами/мутексами. Т.е. есть пул
AP> тредов, им даются задания, если все треды заняты и задания давать некому,
AP> то выполнялась последовательность "тред1", когда кто-то освобождался, он
AP> давал сигнал. Так вот, "тред1" просто не просыпался.
вот и вы на ступили на те же грабли что и я ;)))
нельзя пользоваться cond без вспомогательной переменной
thread 1 thread 2
-------------------------------------------------------------------
cond_broadcast()
cond_wait()
broadcast пришел до того как первый поток сел на cond_wait()
и естественно этот broadcast не получил ;))
volatile int signalled = 0;
thread1()
{
...
mutex_lock(mtx)
while (!signalled)
cond_wait(cond, mtx);
mutex_unlock(mtx);
...
}
thread2()
{
...
mutex_lock(mtx); | mutex_lock(mtx);
signalled = 1; | signalled = 1;
cond_broadcast(cond); |
mutex_unlock(mtx); | mutex_unlock(mtx)
| cond_broadcast(cond);
...
}
и для thread2() фиолетово где cond_broadcast(), внутри блока lock-unlock
или нет...
/swp
--- ifmail v.2.15dev5
* Origin: BSPU InterNetNews site (2:5020/400)