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()到底做了什么初始化操作呢?请自行查看

相关文章推荐

ACE动态服务配置的实例代码分析

ACE-6.0.0提供的动态服务配置实例
  • iw1210
  • iw1210
  • 2014年06月10日 20:48
  • 1598

Unity3d之standalone PC游戏崩溃

当我们开发了一个PC版的游戏之后,发布之际,也是没有问题。但是要是运气不好,那么游戏就生气了。。 *****************游戏它崩溃了*************** 崩溃...

ACE_Thread_Manager示例

// Test out the group management mechanisms provided by the // ACE_Thread_Manager, including the gro...

ACE_Thread_Manager

ACE_INLINE ACE_At_Thread_Exit::ACE_At_Thread_Exit (void) : next_ (0), td_ (0), was_applied...

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

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

network-manager与interfaces冲突

网络配置的两种方式 Ubuntu下修改网络配置有两种方式:图形界面方式(network-manager)和修改/etc/network/interfaces 但是如果两种方式的网络设置不同,就会产...

解决与论坛冲突(Discuz! X3.1)问题

  • 2017年01月19日 17:05
  • 1.14MB
  • 下载

hibernate主键冲突问题

  • 2014年12月25日 16:42
  • 2KB
  • 下载

The Java™ Tutorials — Concurrency :Thread Interference 线程冲突

The Java™ Tutorials — Concurrency :Thread Interference 线程冲突 原文地址:https://docs.oracle.com/javase/t...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ACE_Thread_Manager和WinMain冲突问题
举报原因:
原因补充:

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