多个线程调度顺序的问题

yyhzpk 2005-12-02 03:34:26
window下,有四个等级相同的线程:A,B,C,D
A()
{
WaitForSingleObject(mHmutex1)
...//
ReleaseMute(mHmutex1)
sleep(0);
}
B()
{
WaitForSingleObject(mHmutex2)
...//
ReleaseMute(mHmutex2)
sleep(0);
}
C()
{
WaitForSingleObject(mHmutex3)
...//
ReleaseMute(mHmutex3)
sleep(0);
}
D()
{
WaitForSingleObject(mHmutex4)
...//
ReleaseMute(mHmutex4)
sleep(0);
}
请问:
1.如果程序在运行A线程,执行到sleep(0)时,系统会不会肯定去调用别的线程?
2.如果A成立,这四个线程调用肯定按序进行吗,也就是每调用这里面四个线程,肯
定四个线程都能保证被调用一次吗?(四个线程申请的不是同一个信号量)
...全文
396 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyhzpk 2005-12-09
  • 打赏
  • 举报
回复
我这个是一个生产者和消费者的问题:
例如:A是生产者,C是A的消费者,B是生产者,D是B的消费者.
我想达到每个生产者线线程执行一次,就要让每个消费者执行
一次
luoji 2005-12-09
  • 打赏
  • 举报
回复
楼主没有弄清楚线程的一些基本概念:
1.在线程之间进行同步的原因大致有两个:一个是由于线程之间竞争共享的资源,一个是为了完成某个任务而需要协作.也就是说,线程之间同步的原因是由于竞争和协作.
2.从你定义的同步变量名字来看,你是想用互斥量来同步,而不是信号量.互斥:mutex;信号量:semaphore
3.互斥量,信号量之间的区别.
在同一个时间里,互斥量只允许一个线程访问共享资源,其他竞争该互斥量的线程们则被阻塞,从而进入睡眠状态,称为在该互斥量上睡眠.当第一个线程使用完共享资源,并释放互斥量后,等待在该互斥量的线程醒来并都处于就绪状态,这些线程又竞争互斥量.其中的一个随机地获得互斥量,进入运行状态,其他的再次进入睡眠状态.
信号量允许一个或者多个(最多64个)线程同时存取共享资源.在信号量中有一个内置的计数值,用于对资源进行计数.同时它通过内置的互斥机制保重在有多个线程试图对计数值进行修改时,在任一时刻只有一个线程对计数值进行修改.
4.原子操作 就是说一个操作的一系列步骤必须一次性完成,中间不能打断.拿个例子来说吧,银行里存款就是一个原子操作:将钱交给银行职员,输入密码,将钱存入帐户.......这些操作是不可分割的.互斥的基本目的就是使一系列的操作成为不可分割的原子.
5.其他同步机制,如,临界段,事件........
相同情况下,临界段的效率要高于互斥量.但是临界段只能用于同一个进程内进行线程同步,而互斥量可以用于进程间的线程同步.

由此可以看出,A,B,C,D分别使用不通的互斥量是起不到同步的效果的
打雷啦的专栏 2005-12-06
  • 打赏
  • 举报
回复
既然线程开启,那么可以控制你的信号量来让他是否继续执行.你要线程有顺序,那么控制4个信号量的顺序不就好了
wangk 2005-12-06
  • 打赏
  • 举报
回复
系统能够保证你的线程代码,完整的跑完一次。
当然,中间可能会切换和调度其他的线程。
线程肯定能执行完(只要你的代码没问题),这是毫无疑问的由操作系统保证的。
如果你要保证你的线程的调度顺序,可以用Windows提供的用于Unix程序向Windows移植的纤程。
或者你自己来同步控制。
hjunxu 2005-12-06
  • 打赏
  • 举报
回复
这个要看操作系统内部的调度情况,不应该依赖这个去解决问题
------------------------------------------------
正解。

不知道楼主要解决什么问题,或纯粹是研究。
yyhzpk 2005-12-06
  • 打赏
  • 举报
回复
这四个线程是在同一个进程之内的,我的意思是
只考虑这四个线程的调用顺序,其它线程调度不考虑,
也就是如果系统在这四个线程中调了四次,是不是能保证
每个线程都能被调用一次?
czg516 2005-12-06
  • 打赏
  • 举报
回复
只要你生成了线程,且没有产生死锁,
每个线程都能够跑完,至于谁先谁后,这就不确定了。
oyljerry 2005-12-02
  • 打赏
  • 举报
回复
1,系统会调度,去哪就不确定了
2,要控制顺序,可以用event等来控制
ghyd 2005-12-02
  • 打赏
  • 举报
回复
回答:
1:系统此时肯定会阻塞你的线程,cpu将用于执行其他的操作。
2:至于是不是肯定能执行你的其他线程则不一定,当系统繁忙的时候,可能A执行到sleep后,转而去执行优先级比较高的其他线程,而非你的这四个线程之一。毕竟,windows系统中并不是只有你的这四个线程啊,。
也就是说,答案是:不一定。
wangk 2005-12-02
  • 打赏
  • 举报
回复
个人看法:
1.执行到sleep(0)时,系统会提交调度,但不一定会轮到哪个线程。
2.四个线程不一定按顺序执行,这是由Windows线程调度算法决定。当然四个线程都能被调用一次。
goodboyws 2005-12-02
  • 打赏
  • 举报
回复
这个要看操作系统内部的调度情况,不应该依赖这个去解决问题

15,471

社区成员

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

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