在Linux中,fprintf
函數本身不是線程安全的,這意味著在多線程環境下,如果多個線程同時使用fprintf
向同一個文件寫入數據,可能會導致數據混亂
以下是處理并發寫入問題的一些建議:
#include<stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t file_lock = PTHREAD_MUTEX_INITIALIZER;
void write_to_file(const char *data) {
pthread_mutex_lock(&file_lock);
FILE *fp = fopen("output.txt", "a");
if (fp == NULL) {
perror("fopen");
exit(1);
}
fprintf(fp, "%s\n", data);
fclose(fp);
pthread_mutex_unlock(&file_lock);
}
flockfile
和funlockfile
。這兩個函數可以分別用于鎖定和解鎖一個文件流,從而確保同一時間只有一個線程可以寫入文件。#include<stdio.h>
#include <stdlib.h>
#include <pthread.h>
void write_to_file(const char *data) {
FILE *fp = fopen("output.txt", "a");
if (fp == NULL) {
perror("fopen");
exit(1);
}
flockfile(fp);
fprintf(fp, "%s\n", data);
funlockfile(fp);
fclose(fp);
}
write
系統調用。這些函數可以確保在多線程環境下,數據的完整性得到保證。#include<stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
int fd = open("output.txt", O_WRONLY | O_APPEND | O_CREAT, 0644);
if (fd == -1) {
perror("open");
exit(1);
}
const char *data = "Hello, World!\n";
write(fd, data, strlen(data));
close(fd);
return 0;
}
請注意,這些方法可能會影響程序的性能,因為它們需要在多個線程之間進行同步。在選擇合適的方法時,需要根據實際情況權衡性能和數據完整性的需求。