Re: Порядок захвата mutex'ов.

From
Lev Walkin ()
To
mitrohin a.s. ()
Date
2003-05-29T17:19:16Z
Area
RU.UNIX.PROG
From: Lev Walkin <vlm@netli.com>


mitrohin a.s. wrote:
> 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
> или нет...

А вот интересно, как thread 2 произведет сигнализирование путем вызова
cond_broadcast(), когда он не может сделать mutex_lock(mtx), потому что
thread 1 сам себе висит на while(), захватив mtx?


-- 
Lev Walkin
vlm@netli.com

--- ifmail v.2.15dev5
 * Origin: Netli, Inc. (2:5020/400)