ACE_Thread_Manager和WinMain冲突问题

原创 2013年12月04日 14:17:14
今天在一个Windows的程序中使用了ACE_Thread_Manager::instance ()->spawn来创建新的线程,结果发现程序崩溃。然后改用ACE_Thread::spawn后确发现没有问题,为什么会这样呢?

--------------------------------------------------
author: cs_cjl
website: http://blog.csdn.net/cs_cjl
--------------------------------------------------

第一时间想到的是使用StackWalker打印崩溃的堆栈信息:
Dec 03 18:43:27.807 2013@LM_EMERGENCY@ (8808) OnDbgHelpErr: SymGetLineFromAddr64, GetLastError: 487 (Address: 779B22D2)
Dec 03 18:43:27.807 2013@LM_EMERGENCY@ (8808) 779B22D2 (ntdll): (filename not available): RtlEnterCriticalSection
Dec 03 18:43:27.807 2013@LM_EMERGENCY@ (8808) OnDbgHelpErr: SymGetLineFromAddr64, GetLastError: 487 (Address: 0FFF6D9D)
Dec 03 18:43:27.807 2013@LM_EMERGENCY@ (8808) 0FFF6D9D (ACEd): (filename not available): ACE_OS::thread_mutex_lock
Dec 03 18:43:27.807 2013@LM_EMERGENCY@ (8808) OnDbgHelpErr: SymGetLineFromAddr64, GetLastError: 487 (Address: 100304D0)
Dec 03 18:43:27.807 2013@LM_EMERGENCY@ (8808) 100304D0 (ACEd): (filename not available): ACE_Thread_Mutex::acquire
Dec 03 18:43:27.807 2013@LM_EMERGENCY@ (8808) OnDbgHelpErr: SymGetLineFromAddr64, GetLastError: 487 (Address: 0FF7B8F3)
Dec 03 18:43:27.807 2013@LM_EMERGENCY@ (8808) 0FF7B8F3 (ACEd): (filename not available): ACE_Task<ACE_NULL_SYNCH>::dump
Dec 03 18:43:27.807 2013@LM_EMERGENCY@ (8808) OnDbgHelpErr: SymGetLineFromAddr64, GetLastError: 487 (Address: 0FF77131)
Dec 03 18:43:27.807 2013@LM_EMERGENCY@ (8808) 0FF77131 (ACEd): (filename not available): ACE_Task<ACE_NULL_SYNCH>::dump
Dec 03 18:43:27.807 2013@LM_EMERGENCY@ (8808) OnDbgHelpErr: SymGetLineFromAddr64, GetLastError: 487 (Address: 10029C5D)
Dec 03 18:43:27.807 2013@LM_EMERGENCY@ (8808) 10029C5D (ACEd): (filename not available): ACE_Thread_Exit::instance
Dec 03 18:43:27.808 2013@LM_EMERGENCY@ (8808) OnDbgHelpErr: SymGetLineFromAddr64, GetLastError: 487 (Address: 10029853)
Dec 03 18:43:27.808 2013@LM_EMERGENCY@ (8808) 10029853 (ACEd): (filename not available): ACE_Thread_Adapter::invoke
Dec 03 18:43:27.813 2013@LM_EMERGENCY@ (8808) OnDbgHelpErr: SymGetLineFromAddr64, GetLastError: 487 (Address: 0FFA6B99)
Dec 03 18:43:27.813 2013@LM_EMERGENCY@ (8808) 0FFA6B99 (ACEd): (filename not available): ace_thread_adapter
Dec 03 18:43:27.813 2013@LM_EMERGENCY@ (8808) f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c (314): _callthreadstartex
Dec 03 18:43:27.814 2013@LM_EMERGENCY@ (8808) f:\dd\vctools\crt_bld\self_x86\crt\src\threadex.c (297): _threadstartex
Dec 03 18:43:27.814 2013@LM_EMERGENCY@ (8808) OnDbgHelpErr: SymGetLineFromAddr64, GetLastError: 487 (Address: 75B1336A)
Dec 03 18:43:27.814 2013@LM_EMERGENCY@ (8808) 75B1336A (kernel32): (filename not available): BaseThreadInitThunk
Dec 03 18:43:27.814 2013@LM_EMERGENCY@ (8808) OnDbgHelpErr: SymGetLineFromAddr64, GetLastError: 487 (Address: 779C9F72)
Dec 03 18:43:27.814 2013@LM_EMERGENCY@ (8808) 779C9F72 (ntdll): (filename not available): RtlInitializeExceptionChain
Dec 03 18:43:27.814 2013@LM_EMERGENCY@ (8808) OnDbgHelpErr: SymGetLineFromAddr64, GetLastError: 487 (Address: 779C9F45)
Dec 03 18:43:27.814 2013@LM_EMERGENCY@ (8808) 779C9F45 (ntdll): (filename not available): RtlInitializeExceptionChain

然后查看之前写的程序,发现也是调用了ACE_Thread_Manager却不会出现崩溃的问题,对比了一下,发现之前写的程序用的是main函数而不是WinMain,在这里试了好久后,突然想到对于main函数,ACE会将其替换为ACE的main函数然后执行一系列初始化操作后再调用我们的main,那么会不会是因为由于ACE不会替换WinMain从而导致ACE中的一些初始化没有执行导致ACE_Thread_Manager崩溃呢?

google了一下,发现网上的说法是,如果是WinMain需要在开头手动调用
Init_ACE.h中的ACE::init(),试了一下果然不会崩溃了。

那么ACE自己的main函数中到底执行了什么操作呢?
查啊查发现主要执行以下操作(在OS_main.cpp中):
ACE::init ();
ACE_MAIN_OBJECT_MANAGER
int const i = this->run_i (ce_argv.argc (), ce_argv.argv ());
ACE::fini ();
return i;

原来如此!!!
至于ACE::init()到底做了什么初始化操作呢?请自行查看

main与WinMain的区别

main 是一般C程序的进入点: int main(int argc, char *argv[ ], char *envp[ ]); {     …… } WinMain 则是Win...
  • zhongbin104
  • zhongbin104
  • 2012年10月16日 13:46
  • 3033

主函数 main WinMain _tmain _tWinMain 的区别

主函数 main WinMain _tmain _tWinMain 的区别 main是C/C++的标准入口函数名 WinMain是windows API窗体程序的入口函数。(int...
  • u010890209
  • u010890209
  • 2013年12月10日 09:39
  • 1571

WinMain的基本流程

原文出处:http://blog.csdn.net/tcjiaan/article/details/8497535   一、WinMain入口点 我们在学习标准C++的时候,都知道每...
  • yaked
  • yaked
  • 2016年08月29日 17:14
  • 3945

WinMain()与CWinApp

MFC把有相当固定行为的WinMain()函数内部操作封装在CWinApp中,把有相当固定行为的WndProc()函数内部操作封装在CFrameWnd中。 即CWinApp代表程序本体,CFrame...
  • u010089648
  • u010089648
  • 2013年04月21日 14:28
  • 383

[ACE程序员教程笔记]使用ACE_Thread_Manager创建线程组

ACE_Thread_Manager为ACE_Thread的高级类,使用此接口可以实现对线程进行分组管理,下面将对两个不同的业务处理采用两种不同的处理方式:一个用于回显内容,另一个用于打印内容。#in...
  • maxcode
  • maxcode
  • 2011年01月08日 22:02
  • 2295

WinMain和MFC的区别

WinMain和MFC的区别
  • lasolmi
  • lasolmi
  • 2014年11月01日 13:53
  • 1124

WinMain()主函数

int WINAPI WinMain(HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, ...
  • qq981932962
  • qq981932962
  • 2014年10月24日 20:19
  • 3702

关于不同的程序入口,main(), _tmain(),WinMain(),wmain()?

转自http://blog.sina.com.cn/s/blog_842bf5cd010177f8.html http://topic.csdn.net/t/20010930/15/3087...
  • wanglx2012
  • wanglx2012
  • 2015年11月15日 09:23
  • 932

杂谈之封装main或WinMain启动函数

作者:i_dovelemon 日期:2016 - 04 - 10 来源:CSDN 主题:VS,静态库,类静态函数 引言         公司的上个项目已经结束...
  • i_dovelemon
  • i_dovelemon
  • 2016年04月10日 19:58
  • 808

从Win32程序的主函数WinMain中获取命令行参数

在标准C或者Win32控制台程序的main函数中,它们都有两个参数:"argc" 和 "argv",如下所示: int main(int argc, char * argv[]) 这些参数...
  • ypist
  • ypist
  • 2012年11月01日 19:51
  • 6423
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ACE_Thread_Manager和WinMain冲突问题
举报原因:
原因补充:

(最多只允许输入30个字)