CE5.0下的多线程同步问题

whatseal   2009-9-26 20:46 楼主
在CE5.0下实验多线程同步。实现了3个死循环的子线程,用Event事件来同步。子线程1需要等待子线程2和子线程3对数据的操作完成后才开始下一次的循环。
我在子线程1中使用WaitForMultipleObjects(2,hEvent,TRUE,INFINITE)来等待,其中HANDLE hEvent[2]是这样定义的。结果发现:
子线程1,WaitForMultipleObjects根本就没有等待子线程2的通知事件,一直在循环。子线程3也一直循环。
后来将WaitForMultipleObjects修改如下
WaitForSingleObject(hEvent[0],INFINITE);
WaitForSingleObject(hEvent[1],INFINITE);
就得到我想要的结果了。
这是为什么?从逻辑上讲,这两种方式应该是一样的吧。
难道是我用的这个CE5.0不支持WaitForMultipleObjects?
还望高人帮我分析一下。

回复评论 (32)

有点怪,如果能把你所有的代码贴出来就好分析了

btw:CE5.0支持WaitForMultipleObjects
点赞  2009-9-26 21:10
引用: 引用楼主 ljdtj 的回复:
结果发现:
子线程1,WaitForMultipleObjects根本就没有等待子线程2的通知事件,一直在循环。
子线程3也一直循环。
后来将WaitForMultipleObjects修改如下
WaitForSingleObject(hEvent[0],INFINITE);
WaitForSingleObject(hEvent[1],INFINITE);
就得到我想要的结果了。


1.WaitForMulObs(,,false,);ce5.0不允许wait type设为true.
2.如果是先触发hEvent[1],再触发hEvent[0],线程1会不会继续等待WaitForSingleOb(hEvent[0],);
从而不能及时退出循环
点赞  2009-9-26 22:47
引用: 引用 2 楼 visualthinking 的回复:
1.WaitForMulObs(,,false,);ce5.0不允许wait type设为true.
2.如果是先触发hEvent[1],再触发hEvent[0],线程1会不会继续等待WaitForSingleOb(hEvent[0],);
从而不能及时退出循环


ce5.0不允许wait type设为true.这个你是从哪里知道的啊。
你提到的“线程1会不会继续等待WaitForSingleOb(hEvent[0],);”,这个我没在CE5.0上调试过,在桌面PC上是可行的,不会阻塞线程1,我试过了。你说的“从而不能及时退出循环”我就不太明白了,因为我的3个子线程本来就是死循环,我是定时到了之后ExitThread的。呵呵,这个方式不怎么好。
谢谢visualthinking。
点赞  2009-9-27 14:35
wince下,WaitForMultipleObjects的events数如果大于1,WaitForMultipleObjects将会失败。
点赞  2009-9-27 15:18
MARK !!
点赞  2009-9-27 16:54
引用: 引用 3 楼 ljdtj 的回复:
ce5.0不允许wait type设为true.这个你是从哪里知道的啊。
你提到的“线程1会不会继续等待WaitForSingleOb(hEvent[0],);”,这个我没在CE5.0上调试过,在桌面PC上是可行的,不会阻塞线程1,我试过了。你说的“从而不能及时退出循环”我就不太明白了,因为我的3个子线程本来就是死循环,我是定时到了之后ExitThread的。呵呵,这个方式不怎么好。
谢谢visualthinking。

可以查MSDN ,上面明确说明了fWaitAll必须为FALSE,如果设定为TRUE,系统则会自动设成FALSE或者出错。
fWaitAll
[in] Specifies the wait type. This parameter must be set to FALSE. This causes function to return when the state of any one of the objects set to is signaled. The return value indicates the object whose state caused the function to return.

引用: 引用 4 楼 amorous 的回复:
wince下,WaitForMultipleObjects的events数如果大于1,WaitForMultipleObjects将会失败。

这个WinCE貌似只是对注册到中断的event只允许等待一个。。
点赞  2009-9-27 17:42
估计HANDLE hEvent[2]没正确初始化,把你创建事件和初始化hEvent[2]的代码贴出来看看
点赞  2009-9-27 18:49
谢谢各位的关注!
我后来看了下PB的帮助文档,上面确实说了fWaitAll必须为FALSE。连CE6.0下也是如此。

AAa_tnT大哥,你说的“如果设定为TRUE,系统则会自动设成FALSE或者出错”这个我好像没有找到。还想麻烦你下,将具体的链接贴上来。

我是在Microsoft Visual Studio下编译我写的这个程序的,结果它没有报错,也没有给我任何一个警告(我觉得既然规定了fWaitAll必须为FALSE,那么我这个程序要么应该编译出错,要么应该给个警告吧)。不知道这算不算Microsoft的一个小bug。呵呵。
点赞  2009-9-28 09:14
引用: 引用 8 楼 ljdtj 的回复:
谢谢各位的关注!
我后来看了下PB的帮助文档,上面确实说了fWaitAll必须为FALSE。连CE6.0下也是如此。

AAa_tnT大哥,你说的“如果设定为TRUE,系统则会自动设成FALSE或者出错”这个我好像没有找到。还想麻烦你下,将具体的链接贴上来。

我是在Microsoft Visual Studio下编译我写的这个程序的,结果它没有报错,也没有给我任何一个警告(我觉得既然规定了fWaitAll必须为FALSE,那么我这个程序要么应该编译出错,要么应该给个警告吧)。不知道这算不算Microsoft的一个小bug。呵呵。

是呀,类似这些ms应该把它认为不合理的值编译的时候报错才好,呵呵
点赞  2009-9-28 11:40
呵呵,我记得是在某个博客上看到的。
你可以 看看GetLastError 的返回值。
点赞  2009-9-28 12:27
    hao123被百度收购的消息传出后,在业界引起一片喧哗与骚动,很多人为此困惑不解,为什么这样一个技术简单、仅仅把各类网址收集在一起的网站能够获得百度的青睐,竟然卖出了5000万外加股票期权的天价。不少人在羡慕的同时,心里还在隐隐作痛,后悔自己为什么没有想到建这样一个网站,因为从技术上说,hao123几乎没有任何门槛,业界能够做出来的人何止千万。

  如今又发现一个有这样潜力的我要淘购网www.51taogo.com.cn,它专门收集淘宝上最优的商品和店铺,让您购物更轻松更省心更放心 我要淘购 我要淘个够 我爱淘购!

    请把此信息转发给您的好友,举手之劳,功德无量,您将为这个网上购物世界贡献无比的力量!
点赞  2009-9-28 12:49
dwResult = WaitForMultipleObjects(7, &WaitEvents[0], FALSE, dwWaitTime);楼主还是看看程序,我的程序中等待7个events都是可以的!
点赞  2009-9-28 13:39
LV  GUCCI  香奈儿一比一包包 批发零售!
广州市天龙皮具厂成立于2002年。是一家有多年专业设计、生产、经营高档皮具系列产品的企业。主营LV,GUCCI,CHANEL,世界一线畅销品牌皮具产品。款式多,更新快,出货准时。质量保证,价格实惠,免费代发货至世界各地,欢迎世界各地客商及爱包包人士前来选购。 三个起批可以混批!
网址:http://www.aimosi.com
联系电话:15920907201
MSN:aimosi@live.cn
客服QQ:775035679      957840212  
点赞  2009-9-28 13:41
LV  GUCCI  香奈儿一比一包包 批发零售!
广州市天龙皮具厂成立于2002年。是一家有多年专业设计、生产、经营高档皮具系列产品的企业。主营LV,GUCCI,CHANEL,世界一线畅销品牌皮具产品。款式多,更新快,出货准时。质量保证,价格实惠,免费代发货至世界各地,欢迎世界各地客商及爱包包人士前来选购。 三个起批可以混批!
网址:http://www.aimosi.com
联系电话:15920907201
MSN:aimosi@live.cn
客服QQ:775035679      957840212  
点赞  2009-9-28 13:41
引用: 引用 12 楼 xuefeng_baggio 的回复:
dwResult = WaitForMultipleObjects(7, &WaitEvents[0], FALSE, dwWaitTime);楼主还是看看程序,我的程序中等待7个events都是可以的!

这是可以的 ,一旦7个 event中有一个触发 WaitForMultipleObjects就会成功。
LZ是 要2个 都触发了 才WaitForMultipleObjects成功。WinCE下 并不能这么做。
可以参照下面这个。。MS社区上找的。
DWORD MyWaitForMultipleObjects(DWORD count, const HANDLE *lpHandles,
      BOOL waitAll, DWORD ms)
{
#ifdef _WIN32_WCE
if (!waitAll)
  return WaitForMultipleObjects(count, lpHandles, waitAll, ms);
else
{
  // wait for each in turn. Note that this does not exactly simulate
  // WaitForMultipleObjects, as each object will become signalled as
  // soon as WaitForSingleObjects recognizes it, rather than all becoming
  // signaled together as with WaitForMultipleObjects...
  DWORD ret = WAIT_OBJECT_0;
  for (DWORD n = 0;n < count;n++)
  {
   DWORD d;
   d = WaitForSingleObject(lpHandles, ms);
   if (WAIT_TIMEOUT == d)
   {
    ret = WAIT_TIMEOUT;
    break;
   }
   else if (WAIT_ABANDONED == d)
   {
    ret = WAIT_ABANDONED_0 + n;
    break;
   }
  }


  return ret;
}
#else
return WaitForMultipleObjects(count, lpHandles, waitAll, ms);
#endif



}
点赞  2009-9-28 13:57
谢谢大家,可以结贴了。
点赞  2009-9-28 14:45
呵呵,没想到我的这个帖子得到了推荐。
AAa_tnT大哥,你的功劳最大!
不知道大家还有没有继续讨论下去的兴趣啊。

“dwResult = WaitForMultipleObjects(7, &WaitEvents[0], FALSE, dwWaitTime);楼主还是看看程序,我的程序中等待7个events都是可以的!”请问12楼的xuefeng_baggio兄,你的7个events是用来同步几个线程的?这几个线程是在应用层跑吗?它们的效率怎样?

我的子线程1负责采集数据,子线程2负责将数据处理后送LCD显示,子线程3负责传输数据。不知道这样构架是否合理。目前程序已经跑通,效果好像还可以。我的硬件平台是ARM,ARM是单核心的吧,针对ARM应该如何做多线程优化,还希望有高人来指点一下。
点赞  2009-9-28 19:46
和OHAO
点赞  2009-9-28 20:09
12下一页
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复