游戏开发论坛

 找回密码
 立即注册
搜索
查看: 15258|回复: 36

关于多线程安全的队列……

[复制链接]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
发表于 2004-6-20 14:56:00 | 显示全部楼层 |阅读模式
事情是这样的,我想做网游,用TCP与客户端连接,给每个客户端分配一个线程阻塞地读取socket,各个线程对数据包解包后就把操作请求塞到一个队列里让这些请求按时间顺序得到处理。这样我就需要一个队列,一般只有一个线程会读取它(取出一个操作请求),但是会有多个线程对它执行写入(增加操作请求),但是我的数据结构的书上没有讲到多线程问题。
我考虑了一下,发现不能对整个队列加锁,因为读取队列的时候也可能会有写的操作,所以加锁就得把读取和写入一起加锁,那样可能会出现这种情况:写入的线程不停地增加操作请求,但是因为那个锁总是被写入的线程锁住了,所以读取的线程一直被挂起一直不能处理操作请求……所以不能简单地对整个队列加锁。

想了很久也没个好办法……请大家帮帮我~大家一起讨论讨论也是好的~ [em7] [em6]

10

主题

90

帖子

90

积分

注册会员

Rank: 2

积分
90
QQ
发表于 2004-6-20 16:55:00 | 显示全部楼层

Re:关于多线程安全的队列……

队列当然要加锁

37

主题

180

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2004-6-20 17:04:00 | 显示全部楼层

Re: 关于多线程安全的队列……

因该是可以锁住的

不过建议你使用2个threadlock

1个用在listmgr 的 Protected lock
只锁list 的add/del/get
另一个用在listnode 的write/read lock (会有~n个)
这样lock的时间 会比较短
建议使用 CRITICAL_SECTION..他的效能比较好点
虽然只在process 内.....

...不过重点在thread的规划上....还是走mcv的架构比较好
一个控管资料一个运算处理
[em2]

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2004-6-20 17:51:00 | 显示全部楼层

Re: 关于多线程安全的队列……

coldeye,不要吓我…… [em7]
CRITICAL_SECTION是什么?
mcv的架构是什么?
[em7] [em7] [em7]

37

主题

180

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2004-6-20 19:13:00 | 显示全部楼层

Re: Re: 关于多线程安全的队列……

[quote]
sjinny: Re: 关于多线程安全的队列……

[em5]
thread同步不是有3种方式吗
1.信号机
2.mutex
3.CriticalSection

MCV......... [em13]

你参考4人帮的MODEL.CONTROL.VIEW
他说的是方块的规划
你把他导入THREAD的架构上去..这样接口少

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-6-20 20:00:00 | 显示全部楼层

Re:关于多线程安全的队列……

最开始InitializeCriticalSection();
读写的时候EnterCriticalSection();
读写完了LeaveCriticalSection();
这种方法是WIN32下线程加锁效率最高的方法了。
比WaitForSingleObject()系列的方法效率高很多。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2004-6-20 20:50:00 | 显示全部楼层

Re: 关于多线程安全的队列……

coldeye,CriticalSection是什么? *^^*
关于《设计模式》:我第一章引言就看得晕呼晕呼的了…… [em7]

tarkey,偶的服务器平台是Linux~客户端希望能跨平台~ [em5]

37

主题

180

帖子

180

积分

注册会员

Rank: 2

积分
180
发表于 2004-6-20 21:44:00 | 显示全部楼层

Re: Re: 关于多线程安全的队列……

sjinny: Re: 关于多线程安全的队列……

coldeye,CriticalSection是什么? *^^*
关于《设计模式》:我第一章引言就看得晕呼晕呼的了…… [em7]

...

[em16]小小建议 你可能先不要写core了
开个新project ..写test code....
把CriticalSection包好在动工吧 ( [em19] 这样 跨平台也好换)


你先google找找 很多的

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-6-21 02:23:00 | 显示全部楼层

Re:关于多线程安全的队列……

linux下就更简单了
pthread_mutex_t my_mutex; == CRITICAL_SECTION my_mutex;
pthread_mutex_init(&my_mutex, NULL); == InitializeCriticalSection(&my_mutex);
pthread_mutex_lock(&my_mutex); == EnterCriticalSection(&my_mutex);
pthread_mutex_unlock(&my_mutex); == LeaveCriticalSection(&my_mutex);

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2004-6-21 03:26:00 | 显示全部楼层

Re: 关于多线程安全的队列……

谢谢你们~ [em13]

CriticalSection我查过了,只能在win上用,唯一不理解的是它似乎和互斥量是类似的但是却在性能上有很大差别……
SDL里也提供了互斥量,不知道win版本的是不是用CriticalSection实现的~ [em19]

另外,大家似乎没有意识到问题的麻烦之处。
如果是给整个队列加锁,那么可能互斥锁只是被各个write线程争夺来争夺去,而read线程一直被挂起,这样服务器就不能处理操作请求…… [em17]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-7-2 12:13

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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