static void launch_monitor_thread(xml_binding_t *binding)
{
	switch_threadattr_t *thd_attr = NULL;

	switch_threadattr_create(&thd_attr, globals.pool);
	switch_threadattr_stacksize_set(thd_attr, SWITCH_THREAD_STACKSIZE);
	switch_threadattr_priority_set(thd_attr, SWITCH_PRI_IMPORTANT);
	switch_thread_create(&binding->thread, thd_attr, monitor_thread_run, binding, globals.pool);
}
bool AsyncIOServer::Start(
		switch_memory_pool_t *pool,
		int iThreadCount,
		const char *ip,
		switch_port_t port
		) {
	bool bFlag = false;

	switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "AsyncIOServer::Start( "
			"iThreadCount : %d, "
			"ip : %s, "
			"port : %d "
			") \n",
			iThreadCount,
			ip,
			port
			);

	mRunning = true;
	mpPool = pool;
	mThreadCount = iThreadCount;

	// 创建处理队列
	switch_queue_create(&mpHandleQueue, SWITCH_CORE_QUEUE_LEN, mpPool);

	// 创建处理线程
	switch_threadattr_t *thd_handle_attr = NULL;
	switch_threadattr_create(&thd_handle_attr, mpPool);
	switch_threadattr_detach_set(thd_handle_attr, 1);
	switch_threadattr_stacksize_set(thd_handle_attr, SWITCH_THREAD_STACKSIZE);
	switch_threadattr_priority_set(thd_handle_attr, SWITCH_PRI_IMPORTANT);

	mpHandleThreads = (switch_thread_t**)switch_core_alloc(mpPool, mThreadCount * sizeof(switch_thread_t*));
	for(int i = 0; i < mThreadCount; i++) {
		switch_thread_create(&mpHandleThreads[i], thd_handle_attr, ws_handle_thread, this, mpPool);
	}

	// 开始监听socket
	bFlag = mTcpServer.Start(mpPool, ip, port);

	if( bFlag ) {
		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "AsyncIOServer::Start( success ) \n");
	} else {
		Stop();
		switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "AsyncIOServer::Start( fail ) \n");
	}

	return bFlag;
}