我試過並試圖找到一個關於這個在SO和互聯網上的一般預先討論。也許我做得不對,因爲很難相信這個基本的C語言沒有解決這個問題。使用POSIX線程進行重大日誌記錄的理想方法?
我有一些計算簡單的代碼,但仍需要大量的日誌記錄才能執行。此日誌記錄正在使我的代碼運行速度降低10倍。顯然,解決方案是將日誌記錄分解成單獨的線程或進程。使用單獨的進程需要大量特定於平臺的mumbo-jumbo,我需要此代碼保持儘可能的便攜性(目前正在OS X中開發,稍後將移植到Windows中)。所以我剛開始學習線程和pthread.h。
要明確一點,與Internet上的一些現有pthread討論不同,我們正在討論直接寫入文件而不是I/O。日誌文件永遠不需要被程序讀取。我在做什麼,此刻是:
/* Called many times a second; a few minutes of program usage will make
a couple megs of text in the log file */
void MyLogFunction(char *format, ...)
{
char buffer[1024];
va_list arglist;
va_start(arglist, format);
vsnprintf(buffer, sizeof(buffer) - 1, format, arglist);
va_end(arglist);
pthread_t threadID;
pthread_create(&threadID, NULL, WriteLog, &buffer);
}
/* As written, this function writes unpredictable contents to disk because
I passed it a pointer to a local variable that is getting modified
constantly by the main thread; I know I should be doing something like
allocating new blocks of memory within MyLogFunction() for each pthread,
so let's pretend I'm doing that and move on with the discussion ;-) */
void *WriteLog(void *string)
{
pthread_detach(pthread_self());
fprintf(gLogHandle, "%s: %s\n",
/* OS X time-to-string stuff omitted here */,
(char *)string);
fflush(gLogHandle);
return NULL;
}
我擔心兩件事情:
答:這似乎是不明智的產卵多達幾十並行線程每一秒的。是嗎?
B.有時郵件可能會亂寫,對吧?
這使我考慮以下三個問題:
我應該做一個記錄線程保持打開狀態?如何知道什麼時候不用輪詢而寫另一行?我不能悠閒地輪詢一些
gNewLineIsAvailableToWrite
布爾,因爲這段代碼有時會崩潰,我不能錯過崩潰前的最後一條記錄消息。另外,在日誌中創建新行可以使每隔幾個刻度觸發一個峯值,即每個刻度可能有20行。我應該按照當前顯示的方式製作單獨的pthread,但是給他們彼此的ID並告訴他們
pthread_join()
,以便他們在寫入他們的行之前等待前一個線程完成?這仍然導致線程氾濫,但至少他們會按順序寫入,呃?或者我在看這個問題都不對?
寫入文件**是** I/O。 – SirDarius
您不必將輸入和輸出都作爲I/O進行計數 - 要麼計數。 –
啊,好吧。然後,我沒有說得那麼好,但是我想把這個問題與我所看到的關於使用線程讀入和解析數據的討論區分開來,這是一個比我想解決的更復雜的問題。 – user1134918