|
|
|
|
 线程问题: 请问下面这种情况如何进行异步处理? - phunyx [ 2005-09-22 20:40 | 821 byte(s)]
 自问自答 - phunyx [ 2005-09-26 22:46 | 676 byte(s)]
|
|
|
|
[Original]
[Print]
[Top]
|
我的程序是个解释器,包含一个垃圾回收线程(GC),和一个或多个程序线程(mutators). mutators产生垃圾, GC回收垃圾.
当mutators产生的垃圾比较少时, GC将处于阻塞状态. 当垃圾达到一定量(下限)时,GC将被重新激活,同步进行(mutators继续运行)垃圾回收. 这点是由条件变量实现.
另一方面,我想增加另一控制,使得, 当垃圾太多(达到上限)时, mutators被阻塞,而只让GC运行. 我发现这点没法用信号灯实现, 因此, 我试图也用条件变量实现. 这样当mutators产生垃圾时, 它们将检查垃圾数量, 如果垃圾量已达到上限, mutators将自动阻塞, 等待GC完成垃圾回收后再继续.
当用条件变量实现这点时, 我发现很容易出现死锁. 因为GC在一个由muators控制的条件变量上等待, 而mutators也在一个由GC控制的条件变量上等待, 死锁似乎注定要出现. 请问有没有其他办法实现这种异步控制? 还是条件变量就可以实现这点, 只要某些地方处理得当的话? 万分感谢!
|
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
我后来发现在上面那种情况下死锁其实可以避免,只要将那两个条件变量在同一个互斥子的保护下使用即可。
用伪代码也就是:
Mutators中:
lock mutex;
if( garbage>low_bound ) signal by cond_gc; // 激活GC
if( garbage>up_bound ) wait on cond_mutator; // 暂停mutator
unlock mutex;
GC中:
while( 1 ){ // GC始终运行
lock mutex;
broadcast by cond_mutator; // 激活所有等待的mutator线程
wait on cond_gc; // 等待直到有足够的垃圾要回收
unlock mutex;
回收垃圾;
}
稍加分析就可知道死锁不可能发生。
|
|
|
[Original]
[Print]
[Top]
|
|
|