2013-06-05 145 views
0

這裏的想法是創建要寫入的文件。我正在嘗試創建10個線程,並將它們打印到每個文件10次。使用信號量來停止多個線程一次寫入文件。一切都編譯完成,我沒有得到錯誤退出,但是我不明白爲什麼要多次運行該程序:1)它不會向文件打印100行,實際上它少得多2)打印到該文件每次都有所不同。在C中使用信號量進行多線程處理

#include <stdio.h> 
    #include <sys/types.h> 
    #include <stdlib.h> 
    #include <unistd.h> 
    #include <pthread.h> 
    #include <semaphore.h> 

    #define READ "r" 
    #define NEW  "w" 
    #define ADD  "a" 
    #define NL  "\n" 
    #define TAB  "\t" 

    #define FNAME "PROCTAB.txt" 
    #define MAX_STRING_LEN 80 
    #define NUMBER_OF_THREADS  10 
    FILE *fp; 
    sem_t mutex; 
    int counter; 

    FILE *makeTextFile(char *fname, char mode){ 
     FILE *localFP; 
     localFP = fopen(fname, &mode); 
     return (localFP); 
} 

    void *print_message(void *tid){ 
     int i; 
     for (i = 0; i < 10; i++){ 
      sem_wait(&mutex); 
      fp = fopen(FNAME, ADD); 
      fprintf(fp, "Thread %d is running.\n", tid); 
      fclose(fp); 
     sem_post(&mutex); 
    } 
    } 

    int threads(){ 
    const char *fName = "PROCTAB.txt"; 
     int status; 
     pthread_t threads[NUMBER_OF_THREADS]; 
     fp = makeTextFile(FNAME, 'w'); 
     fprintf(fp, "Process ID: %ld\n", (long)getpid()); 
     fclose(fp); 
    int i; 
     for (i =0; i < NUMBER_OF_THREADS; i++){ 
      status = pthread_create(&threads[i], NULL, &print_message, (void *)i); 
      if (status != 0){ 
       printf("pthread_create returned error code %d\n", status); 
       exit(-1); 
       } 
      } 
     return 0; 
    } 

我的主要功能包含在一個單獨的文件中。

+0

測試'fp'在'FP = FOPEN(FNAME,ADD);',以確保你沒有打開文件成功的所有時間你以爲你做到了。還可以將fp局部化爲'print_message()'。 – chux

回答

2

在退出程序之前,您需要等待所有線程完成。

如果添加跟蹤,您將看到哪個線程完成。

void *print_message(void *tid){ 
    int i; 
    for (i = 0; i < 10; i++){ 
     sem_wait(&mutex); 
     fp = fopen(FNAME, ADD); 
     fprintf(fp, "Thread %d is running.\n", tid); 
     fclose(fp); 
    sem_post(&mutex); 
    printf ("Thread %d has finished.\n", tid); 
} 
} 

這是你如何等待所有線程完成

/* Wait for Threads to Finish */ 
    for (i=0; i<NUMTHREADS; i++) { 
     pthread_join(thread[i], NULL); 
    } 
+0

啊哈,我認爲這是一個很大的問題,它並沒有等待每個線程完成。謝謝 – user1822789

+0

那麼,它回答你的問題? – Mzf

+0

是的,我按照自己想要的方式工作。再次感謝 – user1822789