pwpwpw123
驱动牛犊
驱动牛犊
  • 注册日期2004-01-26
  • 最后登录2007-08-20
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
阅读:1373回复:3

线程等待事件问题

楼主#
更多 发布于:2005-02-17 09:40
现在有多个线程均在循环等待一事件,如何编程保证:
1.每个线程都能等到这一事件。
2.每个线程都不会重复响应同一事件。
Note:各线程并不知道其他线程的存在,也不知道置事件Signal的发起者。

举例如下:

有A,B两个线程循环等待事件Event,有个进程C(发起者)它负责将事件Event置为Signal
我的最初实现是这样:
Thread A

while(1)
{
wait(event);
......
}

Thread B
while(1)
{
wait(event);
......
}

当初的考虑是创建事件时,设置为手动reset,就是C置signal后,C等待一段时间,然后Reset,这样可以保证两个线程的都能响应到事件,但是,会发生同一事件两次响应的情况。而如果在某一线程内reset会导致其他线程响应不到,而设置为自动reset也会导致一部分线程无法响应(没测试过,猜想)
或者这个模型压根不能用事件实现,其他的信号灯,互斥量等等,大侠请帮忙,编程区也发过这个帖子了。
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-02-17 09:52
用事件是没有错,但你应该对不同线程使用不同事件,如果使用同一个事件的确是你说的那样(不论好似自动还是手动,在C中reset还是在线程中reset,正如你说的那样如果在线程中reset应该和自动是有相同的结果)。
当然你还可以使用的同步机制很多,如果都在同一个进程,可用的就更多了。

现在有多个线程均在循环等待一事件,如何编程保证:
1.每个线程都能等到这一事件。
2.每个线程都不会重复响应同一事件。
Note:各线程并不知道其他线程的存在,也不知道置事件Signal的发起者。

举例如下:

有A,B两个线程循环等待事件Event,有个进程C(发起者)它负责将事件Event置为Signal
我的最初实现是这样:
Thread A

while(1)
{
wait(event);
......
}

Thread B
while(1)
{
wait(event);
......
}

当初的考虑是创建事件时,设置为手动reset,就是C置signal后,C等待一段时间,然后Reset,这样可以保证两个线程的都能响应到事件,但是,会发生同一事件两次响应的情况。而如果在某一线程内reset会导致其他线程响应不到,而设置为自动reset也会导致一部分线程无法响应(没测试过,猜想)
或者这个模型压根不能用事件实现,其他的信号灯,互斥量等等,大侠请帮忙,编程区也发过这个帖子了。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
pwpwpw123
驱动牛犊
驱动牛犊
  • 注册日期2004-01-26
  • 最后登录2007-08-20
  • 粉丝0
  • 关注0
  • 积分27分
  • 威望5点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-02-17 09:59
刚才蹲坑时想了个方法,改动如下
Thread A
while(1)
{
wait(event);
......
wait(eventEnd);
}

Thread B
while(1)
{
wait(event);
......
wait(eventEnd);
}

c进程先置event为signal,然后等待一段时间,然后reset,
再置eventEnd为signal,使得A、B再次等待event,似乎可行
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-02-17 11:58
给你个新思路,用互锁队列来做绝佳,将所有线程挂入响应队列。即好理解,又好实现!!
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
游客

返回顶部