- 論壇徽章:
- 0
|
架構(gòu)是這樣的。
主進(jìn)程先初始化了一個線程池A,當(dāng)其中一個線程接收到任務(wù)的時候,就會去創(chuàng)建幾個子線程B來處理任務(wù)。(該A1線程使用pthread_jion等待子線程B退出,子線程用pthread_exit退出)。在子線程B中,使用了malloc函數(shù)連續(xù)分配了2段內(nèi)存。任務(wù)處理完后,在退出pthread_exit前,釋放他們。
其中的異,F(xiàn)象是這樣的,如果我在子線程B中加了日志打印的函數(shù),那么所有子線程退出時,上面申請的兩個連續(xù)內(nèi)存有一半的大小在top中顯示為未釋放(實際上,已經(jīng)釋放了,我向那2段內(nèi)存中memcpy程序core了)。如果我在子線程B中不加日志打印函數(shù),就不會有這個現(xiàn)象。
日志打印函數(shù),檢查過,沒有什么問題。
- #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;
- // 如果設(shè)置的日志級別小直接返回
- 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的臨時變量空間,如果用內(nèi)存分配會不會影響性能
- int i;
- // 如果設(shè)置的日志級別小,則直接返回
- 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);
- }
復(fù)制代碼 |
|