游戏开发论坛

 找回密码
 立即注册
搜索
查看: 7834|回复: 23

win32多线程模式的缺陷与解决

[复制链接]

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
发表于 2009-2-10 03:03:00 | 显示全部楼层 |阅读模式
首先,我将把win32多线程和协作多任务的优劣作个比较.

0) 优点:多线程代码编写方便,多线程程序不会把其他程序卡死

1) 多线程会搅乱数位, 但协作多任务不会

这点是很明显的,不过前提是,你代码逻辑合格,比如遍历list时,后面话不说了

2) 线程同步中存在对 CPU 的浪费,当CPU数量 < 线程数的时候

为了讨论方便先假定 CPU数量 = 1, 并且 "CPU" 指该应用程序的CPU时间

因为多线程会任意搅乱数位, 所以要进行线程同步, 而线程同步的话就存在一些等待,
而所有的操作实质上都是 并 行 地在 一 个 CPU中执行的. 那么这些等待时间中, CPU完全被浪费了

我们再看看协作多任务的情形, 协作多任务就是类似 module_iterater->Update() 这样的方式,
通过手工编码模拟多个任务的并行, 由于我们是用单线程的代码模拟的多任务,
所以不必担心物理上的win32线程同步问题 (只要你代码逻辑合格,比如遍历list时,略)
也就是说没有任何等待时间, 即CPU完全用来执行你程序中的多个并行任务.

3) 就算我不计较上述缺点, 但,win32多线程根本不划算 (游戏开发界)

我们广大的游戏开发世界, 需要编写大量的协作多任务代码, 我们知道协作多任务的代码比win32多线程的在编写上要麻烦点----我们现在牺牲了这点, 那么应该可以换来好处, 就是win32多线程的缺陷不存在了. 而事实呢? 恐怕没有, 因为很多场合我们仍然离不开win32多线程, 比如动态场景加载等.
换言之, 我们用协作多线程写代码而做了牺牲, 同时却又要承受win32多线程的缺陷. 吃力不讨好.

下面,我们谈一谈问题的解决.

1) 协作多任务的代码编写起来不直观.

我想请问编译器做什么去了?这个小的转换工作菜鸟程序员也会写.

2) 就算有一个自动生成协作多任务代码的编译器, 但, 一些库函数是相当耗时的.

这是由于那些库函数不是协作多任务的, 所以会阻塞我们的程序.
但, 其实问题太简单了, 如果世界上没有win32多线程而只有协作多任务, 则一切库函数都是协作多任务的,
那么这个问题还存在吗?

3) “好吧, 但是, 楼主也要考虑考虑, 这样的话多少类库需要重编译成协作多任务的啊?"

初看起来的确有这个问题, 我们要想想看, win32有For win32版本的类库吧?
换句话说计算机界从16位升级到32位时已经作了类库版本的更换.
既然横竖都要更换类库, 就不必担心 "多少类库需要重编译" 这类问题了.

4) 协作多任务可能会把其他程序卡死

我们的编译器做什么去了?
此外别忘了CPU. 我们的CPU也可以限制“超时”(超时的话再去采取抢占措施)

原文出处 http://www.instemast.com/

6

主题

258

帖子

269

积分

中级会员

Rank: 3Rank: 3

积分
269
发表于 2009-2-10 09:15:00 | 显示全部楼层

Re:win32多线程模式的缺陷与解决

你懂得系统的库函数是如何被调用.你知道创建和切换任务要多少开销,你知道在任务间复制和共享数据要哪些工作?多任务之间就不存在读写锁的同步?

笑死人.

19

主题

638

帖子

638

积分

高级会员

Rank: 4

积分
638
发表于 2009-2-10 13:07:00 | 显示全部楼层

Re:win32多线程模式的缺陷与解决

不得不说:
Windows 3.x就是lz所说的协同多任务,lz装一个写写程序体验一下再来做比较。线程是系统资源,是用来实现真正的并行的,不是用来解决逻辑问题的。你拿错了了锤子,不能就说锤子是不对的。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-2-10 20:39:00 | 显示全部楼层

Re: Re:win32多线程模式的缺陷与解决

stephen_z: Re:win32多线程模式的缺陷与解决

你懂得系统的库函数是如何被调用.你知道创建和切换任务要多少开销,你知道在任务间复制和共享数据要哪些工作?多任务之间就不存在读写锁的同步?

笑死人.


我文章中说过了, 协作多任务之间当然需要同步, 世界上任何并行程序都存在同步。
但这不存在CPU时间的浪费,而且也不会出物理问题。(只是逻辑上的事情)

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-2-10 20:44:00 | 显示全部楼层

Re: Re:win32多线程模式的缺陷与解决

qrli: Re:win32多线程模式的缺陷与解决

不得不说:
Windows 3.x就是lz所说的协同多任务,lz装一个写写程序体验一下再来做比较。线程是系统资源,是...


win3.x性能不好,不是因为它是协同多任务,而是逻辑上的问题。这是因为:

如果只有1枚CPU,那么协同多任务和多线程都是用串行指令模拟的并行,
所以你不能说协同多任务很差,因为它们两个本质上几乎是一样的,
只不过,多线程多出了一些问题来。也就是说相比之下多线程较差。

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-2-10 20:49:00 | 显示全部楼层

Re:win32多线程模式的缺陷与解决

总之,IT界目前相当腐败,举例如:

2000年问题
实模式(多线程)
ANSI,乱码
unicode中乱放字符
ANSI文本反而没有编码标志,UC文本反而有
类库文档只有大量形式化的废话
编程方法不是依据需求,而是依据机器
所谓的技术就是,A牌钢笔,A2牌钢笔,A3牌钢笔的使用方法
所谓的技术就是,不懂汉语拼音的情况下用"鸟枪法"输入了一篇文章

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-2-10 20:59:00 | 显示全部楼层

Re: Re:win32多线程模式的缺陷与解决

stephen_z: Re:win32多线程模式的缺陷与解决

你懂得系统的库函数是如何被调用.你知道创建和切换任务要多少开销,你知道在任务间复制和共享数据要哪些工作?多任务之间就不存在读写锁的同步?

笑死人.


不知道你了不了解 并行计算模型 阿。
C++,.net,win32,这些东西都是基于 串行计算模型(图灵机)的。

就算多线程多么多么好,但遇到 并行计算模型 只不过是班门弄斧罢了。
CreateThread也只不过是串行计算框架下的。

你不妨搜索一下真正的 并行计算编程语言。

6

主题

258

帖子

269

积分

中级会员

Rank: 3Rank: 3

积分
269
发表于 2009-2-11 11:20:00 | 显示全部楼层

Re:win32多线程模式的缺陷与解决

首先,我将把win32多线程和协作多任务的优劣作个比较.
=========================================================
还要我继续拆穿你的西洋镜么,并行计算模型就是你说的"协作多任务"?

谁告诉你的C,C++语言不能实现并行算法?搞笑!

362

主题

3023

帖子

3553

积分

论坛元老

Rank: 8Rank: 8

积分
3553
 楼主| 发表于 2009-2-11 21:46:00 | 显示全部楼层

Re:win32多线程模式的缺陷与解决

我没有说 并行计算模型==协作多任务
也没有说 C,C++语言不能实现并行算法(本文就是讨论了2种C++的并行算法的好坏)

不知道是谁搞笑

"C++能实现并行算法" 不代表 "多线程很优秀"

6

主题

258

帖子

269

积分

中级会员

Rank: 3Rank: 3

积分
269
发表于 2009-2-12 09:31:00 | 显示全部楼层

Re:win32多线程模式的缺陷与解决

那你到底是想说多任务还是并行计算的好处呢? 别忘了,即使是并行算法,其中每一个节点上也是有串行成份的.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-16 00:42

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表