线程同步时的进入是否是先进先出的?

clane 2003-10-29 04:15:13
恩,如果有一组线程在等待进入一个临界区,那进入顺序时候是先等待的先进入?还是乱序的?
哪位指点一下,我需要确切的答案.不要好像之类的.:) 因为我自己记得好像是保证FIFO的.
...全文
146 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
oygy 2003-10-30
  • 打赏
  • 举报
回复

<<WINDOWS核心编程>>里曾阐述过线程的调度并无顺序可言,完全是操作系统的职责,而且微软对其调

度算法也是含糊其词的,所以这个优先级次序不能由我们程序员可以左右.
beyondtkl 2003-10-30
  • 打赏
  • 举报
回复
同意楼上.
应该多看看操作系统的进程调度
clane 2003-10-30
  • 打赏
  • 举报
回复
分少了一点。不好意思。呵呵
clane 2003-10-30
  • 打赏
  • 举报
回复
呵呵,感谢aachenG回复了我这么多。:)
不过对于不是用完成端口实现的IO模型,一般不会有多个线程处理一个IO的问题。。。假设有几千个客户端连着你不停的发包,这种排序的代价。。。我还不如直接用多线程一个IO一个线程的效率高多了。
可惜没有这方面的完善代码可以参考啊。
结帖了。
aachenG 2003-10-30
  • 打赏
  • 举报
回复
誰先讀,誰後讀,也會"超级恐怖"? 看來你程序中需要進行同步互斥的地方不是這裡吧?
"性能要求非常高,不能自己弄個對列去排序"? 操作系統為CPU調度線程還要分優先級排序呢.要達到你的目的,還是必須自己去排序,調度,沒有現成的MFC可以用.
clane 2003-10-30
  • 打赏
  • 举报
回复
不,不,不是这样的。我里面也有读写问题处理,但我的问题就是存在多个读的时候,要保证先读的先进入。。。我看过一些server的源代码,好像都没有对这个问题作过处理阿。。。
aachenG 2003-10-30
  • 打赏
  • 举报
回复
具體問題具體解決,這個要用同步去處理.建議你去看看每本操作系統教程都有的讀寫文件時,寫優先還是讀優先的公平問題.你的情況好像和寫優先的處理差不多.
clane 2003-10-30
  • 打赏
  • 举报
回复
那这样的话,对于数据的等待处理岂不是超级麻烦?
例如
A,B,C三个数据先后到达,处理A的时候,B和C在外面等待。对于一个对性能要求非常高的程序,
又不能自己弄个队列去排序。。
那就是说有可能先处理到C再处理B了?
岂不是超级恐怖?
各位的程序里面怎么解决的阿?
vcforever 2003-10-29
  • 打赏
  • 举报
回复
我认为不是先进先出的,因为线程的调度是由操作系统来完成的,我们无权决定下一个时刻哪个线程应该进入临界区或可以访问共享资源,只有操作系统才能根据到底是哪个进程或哪个线程迫切的需要CPU,进而把CPU时间分配给他!所以我认为线程的同步是无序的!
aachenG 2003-10-29
  • 打赏
  • 举报
回复
是否真的是谁先等待谁先进来,不是我们所应该利用的。因为这是分属同步与互斥的两个不同概念,而我们有另外的方法去实现同步。
保证某一时刻只有一个线程访问一个资源,这是互斥,是临界区的责任;
保证一段代码比另一段代码先执行,这是同步,可以用CEvent,SendMessage等去实现。
再说,你的多个线程并发运行,谁先等待临界区,是你能预见的吗?如果你真的能预见,并且还在代码中利用上了,那么你应该对它们进行同步而不是互斥。
topwork 2003-10-29
  • 打赏
  • 举报
回复
楼上的说的不错,却是不存在“等待队列”或者类似的概念,但是如果你编写一个程序试试,最后形成的结果就是谁先等待谁先进来,有很大的概率都是这种情况,我的帖子说“绝对是”是不对的。
flyelf 2003-10-29
  • 打赏
  • 举报
回复
gz
aachenG 2003-10-29
  • 打赏
  • 举报
回复
臨界區不是先等待的先進入的,絕對.如果大家都在等待,那麼CPU先調用誰,誰就可以先進入.

臨界區只是一個"保證某一時刻只有一個線程訪問一個資源"的概念,如果哪個類有甚麼附加功能的話,MSDN會告訴你的,不要想得太複雜了.

要事先等待先進入,就要靠你的程序邏輯去支持了.
lop5712 2003-10-29
  • 打赏
  • 举报
回复
乱序的,我在下面的帖子中给出过解释
http://expert.csdn.net/Expert/topic/2340/2340182.xml?temp=.871792
topwork 2003-10-29
  • 打赏
  • 举报
回复
利用临界区进行线程互斥肯定是先进现出的,如果想控制进出的顺序请不要用临界区,考虑其他内核对象。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧