找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 3657|回复: 2

问个ACE_Thread_Manage的简单问题

[复制链接]
发表于 2009-2-14 00:49:59 | 显示全部楼层 |阅读模式
是这样,在学习ACE,刚看到多线程那块,看着例子试着写些东西做练习,现在碰到这样一个问题,我的代码在调用ACE_Thread_Manage::instance()->spawn_n的时候总会出错,调试的时候在代码ACE_OS::thread_mutex_lock()这个函数里发现m这个参数是空指针,看来看去跟例子里的调用方法好像没区别丫。代码贴出来,大家帮忙看看
另外请教一下,spawn这个函数里头那些个THR_NEW_LWP还有THR_DETACHED这些标志位什么意思?

  1. #include <ace/Thread_Manager.h>
  2. #include <ace/Synch.h>
  3. #include <ace/Log_Msg.h>
  4. struct THREADARG
  5. {
  6. public:
  7. THREADARG(ACE_Mutex * mutex_p)
  8.   : mutex_(mutex_p)
  9.   , number(0)
  10. {
  11. }
  12. ACE_Mutex * mutex_;
  13. int   number;
  14. };
  15. static void * WorkThread(void * arg)
  16. {
  17. THREADARG * arg_ = (THREADARG *)arg;
  18. ACE_DEBUG((LM_DEBUG,"Begin thread id = %t,number = %d\n",arg_->number));
  19. //arg_->mutex_->acquire();
  20. arg_->number++;
  21. ACE_OS::sleep(1);
  22. ACE_DEBUG((LM_DEBUG,"Thread id = %t,number = %d\n",arg_->number));
  23. //arg_->mutex_->release();
  24. //arg_->mutex_->acquire();
  25. arg_->number++;
  26. ACE_OS::sleep(1);
  27. ACE_DEBUG((LM_DEBUG,"Thread id = %t,number = %d\n",arg_->number));
  28. //arg_->mutex_->release();
  29. ACE_DEBUG((LM_DEBUG,"Thread id = %t exit!\n"));
  30. return 0;
  31. }
  32. int _tmain(int argc, _TCHAR* argv[])
  33. {
  34. ACE_DEBUG((LM_DEBUG,"Now begin work 5 thread!\n"));
  35. ACE_Mutex mutex;
  36. THREADARG thr_arg(&mutex);
  37. //  for (int i = 0;i < 5;i++)
  38. //   ACE_Thread_Manager::instance()->spawn((ACE_THR_FUNC)WorkThread,&thr_arg,THR_NEW_LWP | THR_DETACHED,0,0,ACE_DEFAULT_THREAD_PRIORITY,1);
  39. ACE_Thread_Manager * thread_manage = ACE_Thread_Manager::instance();
  40. int nret = thread_manage->spawn_n(5,(ACE_THR_FUNC)WorkThread,(void *)&thr_arg,THR_NEW_LWP ,ACE_DEFAULT_THREAD_PRIORITY);
  41. if (nret == -1)
  42.   ACE_DEBUG((LM_DEBUG,"Thread begin failed!\n"));
  43. ACE_Thread_Manager::instance()->wait_grp(nret);
  44. ACE_DEBUG((LM_DEBUG,"All thread exit!\n"));
  45. return 0;
  46. }
复制代码
发表于 2009-2-20 21:11:02 | 显示全部楼层
  1. #include <ace/Thread_Manager.h>
  2. #include <ace/Synch.h>
  3. #include <ace/Log_Msg.h>
  4. #if defined(WIN32)
  5. #pragma comment(lib,"ACEd.lib")
  6. #endif
  7. struct THREADARG
  8. {
  9. public:
  10.     THREADARG(ACE_Mutex * mutex_p)
  11.         : mutex_(mutex_p)
  12.         , number(0)
  13.     {
  14.     }
  15.     ACE_Mutex * mutex_;
  16.     int   number;
  17. };
  18. static void * WorkThread(void * arg)
  19. {
  20.     THREADARG * arg_ = (THREADARG *)arg;
  21.    
  22.     ACE_DEBUG((LM_DEBUG,"%t number = %d\n",arg_->number));
  23.    
  24.     arg_->mutex_->acquire();
  25.     arg_->number++;
  26.     arg_->mutex_->release();
  27.     ACE_OS::sleep(1);
  28.     ACE_DEBUG((LM_DEBUG,"%t number = %d\n",arg_->number));
  29.    
  30.     arg_->mutex_->acquire();
  31.     arg_->number++;
  32.     arg_->mutex_->release();
  33.     ACE_OS::sleep(1);
  34.     ACE_DEBUG((LM_DEBUG,"%t number = %d\n",arg_->number));
  35.    
  36.     ACE_DEBUG((LM_DEBUG,"%t exit!\n"));
  37.     return 0;
  38. }
  39. int ACE_TMAIN(int argc, ACE_TCHAR* argv[])
  40. {
  41.     ACE_DEBUG((LM_DEBUG,"Now begin work 5 thread!\n"));
  42.     ACE_Mutex mutex;
  43.     THREADARG thr_arg(&mutex);
  44.     ACE_Thread_Manager * thread_manage = ACE_Thread_Manager::instance();
  45.     int nret = thread_manage->spawn_n(
  46.         5,
  47.         (ACE_THR_FUNC)WorkThread,
  48.         (void *)&thr_arg,
  49.         THR_NEW_LWP | THR_JOINABLE );
  50.     if (nret == -1)
  51.         ACE_ERROR_RETURN((LM_DEBUG,"Thread begin failed!\n"), -1);
  52.     ACE_Thread_Manager::instance()->wait_grp(nret);
  53.     ACE_DEBUG((LM_DEBUG,"All thread exit!\n"));
  54.    
  55.     return 0;
  56. }
复制代码

出现错误的原因估计是main函数已经退出,但是线程还没有退出。

分离的(THR_DETACHED),ACE会在线程退出时自动清理这个线程持有的所有资源,其它线程无法查看这个线程的退出状态。
可会合的(THR_JOINABLE),主线程通过调用任务对象的wait()来等待子线程,如果你没有wait()它的话,你就可能泄漏系统资源。

关于你说的其它的标志位,你可以上google搜索一下,这方面的资源还是挺多的。

http://blog.csdn.net/xjtuse_mal/archive/2009/01/07/3726676.aspx

[ 本帖最后由 _coco 于 2009-2-20 21:12 编辑 ]
发表于 2009-2-24 11:13:42 | 显示全部楼层
你得使用ACE_TMAIN作为入口,完成对ACE的初始化。
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-12-23 22:45 , Processed in 0.018339 second(s), 7 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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