- 论坛徽章:
- 0
|
架构是这样的。
主进程先初始化了一个线程池A,当其中一个线程接收到任务的时候,就会去创建几个子线程B来处理任务。(该A1线程使用pthread_jion等待子线程B退出,子线程用pthread_exit退出)。在子线程B中,使用了malloc函数连续分配了2段内存。任务处理完后,在退出pthread_exit前,释放他们。
其中的异常现象是这样的,如果我在子线程B中加了日志打印的函数,那么所有子线程退出时,上面申请的两个连续内存有一半的大小在top中显示为未释放(实际上,已经释放了,我向那2段内存中memcpy程序core了)。如果我在子线程B中不加日志打印函数,就不会有这个现象。
日志打印函数,检查过,没有什么问题。
- #define LOG_INFO Log_SysInfo(LOG_LEVEL_INFO,__FILE__,__LINE__),Log_Msg
- void Log_SysInfo(const int iLogLevel, const char *pszFileName, const int iNum)
- {
- int i = 0;
- char szLogTime[30];
- // 加一个写日志的线程锁
- pthread_mutex_lock(&g_WriteLog);
- memset(szLogTime, 0, sizeof(szLogTime));
- memset(g_szLogHead, 0, sizeof(g_szLogHead));
- g_iLogLevel = iLogLevel;
- // 如果设置的日志级别小直接返回
- if(g_iSetLogLevel < g_iLogLevel)
- {
- return;
- }
- Log_Check();
- timev_GetLogTime(szLogTime);
- snprintf(g_szLogHead, sizeof(g_szLogHead), "%s %s L=%d T=%ld E=%d ", szLogTime, pszFileName,
- iNum, pthread_self(), errno);
- switch(iLogLevel)
- {
- case LOG_LEVEL_ERROR:
- sprintf(g_szLogHead + strlen(g_szLogHead), "%s", "[ERROR] ");
- break;
- case LOG_LEVEL_WARN:
- sprintf(g_szLogHead + strlen(g_szLogHead), "%s", "[WARN] ");
- break;
- case LOG_LEVEL_DEBUG:
- sprintf(g_szLogHead + strlen(g_szLogHead), "%s", "[DEBUG] ");
- break;
- case LOG_LEVEL_INFO:
- sprintf(g_szLogHead + strlen(g_szLogHead), "%s", "[INFO] ");
- break;
- case LOG_LEVEL_ALL:
- sprintf(g_szLogHead + strlen(g_szLogHead), "%s", "[ALL] ");
- break;
- default:
- break;
- }
- }
- void Log_Msg(const char *format, ...)
- {
- FILE *fp;
- va_list args;
- int olderrno;
- //char szContext[1024*10]; // 分配10K的临时变量空间,如果用内存分配会不会影响性能
- int i;
- // 如果设置的日志级别小,则直接返回
- if(g_iSetLogLevel < g_iLogLevel)
- {
- pthread_mutex_unlock(&g_WriteLog);
- return;
- }
- olderrno = errno;
- //memset(szContext, 0, sizeof(szContext));
- if(NULL != (fp = fopen(g_szLogFile, "a+")))
- {
- fprintf(fp, "%s", g_szLogHead);
- va_start(args, format);
- // fprintf(fp, "%s\n", szContext);
- vfprintf(fp, format, args);
- // fflush(fp);
- va_end(args);
- fprintf(fp, "%s", "\n");
- fclose(fp);
- }
- else
- {
- printf("fopen error, errno=%d, file=%s\n", errno, g_szLogFile);
- perror("fopen");
- //printf("context1 [%s], file[%s:%d] \n", szContext, __FILE__, __LINE__);
- }
- errno = olderrno;
- pthread_mutex_unlock(&g_WriteLog);
- }
复制代码 |
|