一般网络多线程服务器软件开发会涉及ACE和log4cxx。
使用ACE_Task可以很方便地进行多线程编程。
本文将简单演示一下,如何使用log4cxx可以日志的形式记录多线程的执行情况;以及如何使用procexp.exe查看当前进程中执行的线程。
以下是一段简单的代码:
#include "ace/OS.h"
#include "ace/Task.h"
#include <iostream>
#include <log4cxx/logger.h>
#include <log4cxx/basicconfigurator.h>
#include <log4cxx/propertyconfigurator.h>
#include <log4cxx/xml/domconfigurator.h>
#include <log4cxx/helpers/exception.h>
using namespace log4cxx;
using namespace log4cxx::xml;
using namespace log4cxx::helpers;
class MyTask : public ACE_Task<ACE_NULL_SYNCH>
{
public:
MyTask() {
BasicConfigurator::configure();
PropertyConfigurator::configure("log4j.properties");
_rootLogger = Logger::getRootLogger();
}
int svc()
{
_rootLogger->debug("执行线程");
for (int i = 0; i < 100; ++i)
{
Sleep(1000);
}
return 0;
}
private:
LoggerPtr _rootLogger;
};
int ACE_TMAIN(int, ACE_TCHAR *[])
{
MyTask task;
task.activate(THR_NEW_LWP | THR_JOINABLE, 2);
task.wait();
task.close();
return 0;
}
代码中,将分配2个线程,这两个线程都会执行svc()方法。
使用procexp.exe可以查看当前的进程中的线程情况,如下图所示:
可以看到进程4992,分配了三个线程:3452(主线程)、4144、5576(因为这两个线程大部分时间都是Sleep,所有看不到所占用的CPU情况)
日志文件hello.log中也记录相应的情况:(进程ID使用的十六进制)
DEBUG root [0x00001030] - 执行线程 ---> 4144线程
DEBUG root [0x000015c8] - 执行线程 ---> 5576线程
======================================
本文示例中使用的log4cxx,可以参考另一篇文章:
windows下log4cxx编译和使用记录
http://blog.csdn.net/vivianke/article/details/7833482