URN Logo
UNIX Resources » Linux » China Linux Forum » C/C++编程版 » 25 » 线程问题: 请问下面这种情况如何进行异步处理?
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
线程问题: 请问下面这种情况如何进行异步处理?
 
自问自答 - phunyx [2005-09-26 22:46 | 676 byte(s)]
 
Subject: 线程问题: 请问下面这种情况如何进行异步处理?
Author: phunyx    Posted: 2005-09-22 20:40    Length: 821 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]
Subject: 自问自答
Author: phunyx    Posted: 2005-09-26 22:46    Length: 676 byte(s)
[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]
« Previous thread
linux中怎么能将reserved以及commit内存分开呢?
C/C++编程版
25
Next thread »
想开发radius客户端程序,请指点!
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 03:52:36, cost 0.054044961929321 ms.