Creative Commons License
本Blog采用 知识共享署名-非商业性使用-禁止演绎 3.0 Unported许可协议 进行许可。 —— Fox <游戏人生>

游戏人生

游戏人生 != ( 人生 == 游戏 )
站点迁移至:http://www.yulefox.com。请订阅本博的朋友将RSS修改为http://feeds.feedburner.com/yulefox
posts - 62, comments - 508, trackbacks - 0, articles - 7

门窥多线程安全

Posted on 2008-01-10 04:02 Fox 阅读(2707) 评论(10)  编辑 收藏 引用 所属分类: G游戏编程

Author: Fox

一、多线程安全的引入:

关于什么是多线程、为什么使用多线程的问题,大家可以看看Jim Beveridge & Robert Wiener的《Win32多线程程序设计》(侯捷 译),或者其他随便一本提到多线程的书或文章。这里只是提到Windows环境下多线程容易引发的问题和解决办法。

1、线程在时间片结束时退出做不到

由于Windows属于分时操作系统,系统会为每个线程分配响应的时间片使其工作,绝大多数线程不可能在时间片结束的时候完成其工作,而下一个时间片就有可能分配给其他线程。

2、线程独立做不到

如果线程间不存在依赖关系,即线程A的执行不依赖于线程B的执行,此时即使线程B被打断,由于线程独立,所以二者也可以相安无事。

然而,在多线程解决方案中,线程间的通信是频繁而且必要的。线程通信主要有两种情况:

1) 多个线程共享相同资源;

2) 一个线程的执行依赖于其他线程的结果或执行情况。

这时,我们就需要实现共享资源及线程执行的同步。

二、多线程安全的解决方案:

因此,多线程安全的目标就是实现共享资源的互斥访问和线程执行的同步通信。

通过对操作系统的学习,我们知道线程同步主要有以下方法:

1) 临界段(Critical Section)

a) 临界资源的取舍,宜少不宜多,宜短不宜长,一个线程只能最多等待一个临界段;

b) 无法侦测一个临界段是否已经被放弃;

c) 临界段属于用户对象。

2) 互斥锁(Mutex)

同临界段一样,互斥锁也主要用于保证资源的原子访问,二者的不同之处在于:

a) 互斥锁属于可具名内核对象;

b) 互斥锁可以跨进程使用,临界段只能用于同一进程内;

c) 互斥锁可以指定等待时间,而且可以等待其他内核对象。

3) 事件(Event)

a) 事件重置具有人工重置和自动重置两种方式,简单说来,二者分别用于多读和单写;

b) 事件主要用于线程间相互通知(唤醒);

C) 事件属于可具名内核对象。

4) 信号量(Semaphore)

a) 信号量属于可具名内核对象;

b) 信号量没有拥有者,可被任一线程释放;

关于Win32中这四种对象的使用和要点,更详细的介绍可以参照《Win32多线程程序设计》或《Windows核心编程》(Jeffrey Richter)等。

三、多线程安全的实现:

将对数据(对象、模型、消息、Socket)的I/O处理放在同一个I/O线程中,保证如队列的push/pop操作、链表的insert/delete操作、文件的write操作、socket的recv/send操作、全局变量的write操作等的互斥访问。

新建独立模块,尤其是使用第三方库的独立模块,大多会创建独立的新线程。此时就需要对新线程中的数据操作加以注意,可以通过对操作数据的加锁访问解决同步问题,当然,更常见的处理方式是将新线程中的数据操作发送到专门的I/O线程中处理。

总之,多线程安全是个常说常新的话题,现在有人提出Lock-Free数据结构的解决方案(Maged M. Michael),也有所谓的Wait-Free的解决方案(Maurice Herlihy),而国内网游界的大牛云风同学更是提出了单线程多进程的观点和解决方案(因为不了解,按字面有可能存在断章取义之嫌)。但不管怎么样,从中至少可以看出,多线程,说来话长。

零零散散、东拉西扯、不知所云的讲了一些东西,未必正确,更不能当作知识。全当是对上次的承诺有个交代。

/*****************************************************************************
 想把多线程的问题搞明白,不是说看看操作系统教材,写点多线程读写的代码就够的。且不论孰是孰非,
 单就网上诸多高手新学对加锁策略铺天盖地的争执说辞甚至相互批判指责,足可见多线程开发并非只言
 片语即可挑明。
 为防止陷入细节争论,这里先作声明:小文仅就所学略抒拙见,无意引起争端……
*****************************************************************************/

Feedback

# re: 门窥多线程安全  回复  更多评论   

2008-01-10 04:11 by Fox
因为今明两天要去雅安碧峰峡一游,所以,沙发留给自己了,也对到这儿的兄弟们有个交代……

# re: 门窥多线程安全  回复  更多评论   

2008-01-10 08:18 by mugong
感觉LZ写得比较浅,只有借鉴作用。该怎么写,我也不大清楚o(∩_∩)o...哈哈

# re: 门窥多线程安全  回复  更多评论   

2008-01-10 09:35 by <a href=http://minidx.com>minidxer</a>
到处玩,真是开心

# re: 门窥多线程安全  回复  更多评论   

2008-01-10 22:41 by 漂泊者
兄弟现在深入研究技术了,靠,我现在是废了
搞得最多的是开会了。。。赫赫!

# re: 门窥多线程安全  回复  更多评论   

2008-01-11 18:15 by Fox
@mugong
现在不想在blog里写带代码的东西,精力太有限了,只想在这儿放松一下,还请原谅 :(

# re: 门窥多线程安全  回复  更多评论   

2008-01-11 18:16 by Fox
@minidxer
是啊,平时工作比较辛苦,出去玩一玩,放松一下啊 :)

# re: 门窥多线程安全  回复  更多评论   

2008-01-11 18:17 by Fox
@漂泊者
也没有多深入,只是想在年轻的时候做点事情……

今天看到几句话,很有道理,与各位辛勤工作的朋友共勉:
不能饿了才吃,不能渴了才喝,不能困了才睡,不能累了才歇,不能病了才检查。

# re: 门窥多线程安全  回复  更多评论   

2008-01-11 18:45 by <a href=http://minidx.com>minidxer</a>
开心阿~
现在我是没心情出去玩

# re: 门窥多线程安全  回复  更多评论   

2008-01-14 14:44 by ms.gofixiao
果然是东拉拉西扯扯哦o(∩_∩)o...,希望完善一下。

# re: 门窥多线程安全  回复  更多评论   

2008-01-14 14:48 by Fox
@ms.gofixiao
恩,因为毕竟不是对多线程的技术要点都有一个全面的把握,所以要想好好写,也不容易。。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理