在多線程環境中,fprintf
函數本身并不是線程安全的
為了在多線程環境中使用 fprintf
函數,你可以采取以下措施:
#include<stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t file_mutex = PTHREAD_MUTEX_INITIALIZER;
void *thread_function(void *arg) {
// 獲取互斥鎖
pthread_mutex_lock(&file_mutex);
// 使用 fprintf 函數寫入文件
FILE *file = fopen("output.txt", "a");
if (file != NULL) {
fprintf(file, "Thread %ld wrote to the file.\n", (long)arg);
fclose(file);
}
// 釋放互斥鎖
pthread_mutex_unlock(&file_mutex);
return NULL;
}
使用線程局部存儲(Thread Local Storage,TLS)將每個線程的輸出緩沖到一個獨立的緩沖區,然后在適當的時候將這些緩沖區的內容合并到共享文件中。這種方法可以減少對共享資源的爭用,提高程序的性能。
使用線程安全的文件 I/O 庫,如 GNU 的 g_async_safe_printf
函數。這些庫通常會使用低級別的系統調用(如 write
)來實現線程安全的文件操作,而不是使用標準 C 庫中的 fprintf
函數。
請注意,這些方法可能會影響程序的性能和可移植性。在選擇解決方案時,請根據你的具體需求進行權衡。