PRINT マクロのスレッド セーフについて疑問に思っていたので、自分の状況でのファイル操作がスレッド セーフかどうかを確認するプログラムを作成したので、fn0 にスリープを追加したところ、スレッド セーフであることがわかりました。
$cat t
fn1
fn0
両方を印刷し、上書きしません。
テストは十分ですか、それとも他の状況はありますか PS : ファイル ポインターを共有していませんが、順序付けには満足しています (順序付けされていない/順序付けされていないことは問題ありません)。
- - - - - -大きい - - - - - - -
#define PRINT(args ...) if (logflag) { \
FILE *flog = fopen(LOGFILE, "a"); \
fprintf( flog, args); \
fclose(flog); \
} fprintf(stderr, args); fflush(stderr);
-------------------テストプログラム--------------------------------
#include <stdio.h>
#include <pthread.h>
#define LOGFILE "t"
char c='1';
void *fn0(void* v)
{
FILE *flog = fopen(LOGFILE, "a");
//sleep(2);
fprintf( flog,"%s\n", "fn0");
fclose(flog);
printf ("Enter value ");
c=getchar();
}
void* fn1(void*v)
{
FILE *flog = fopen(LOGFILE, "a");
fprintf( flog,"%s\n", "fn1");
fclose(flog);
}
int main()
{
pthread_t t0;
pthread_t t1;
pthread_create(&t0, NULL, fn0, (void *) NULL);
pthread_create(&t1, NULL, fn1, (void *) NULL);
pthread_join(t1, NULL);
pthread_join(t0, NULL);
return 0;
}