2016-09-21 46 views
0

我正在使用多線程訪問使用線程的各種隨機文件。但是,我收到錯誤[Thread 0x7ffff7007700 (LWP 16256) exited]。此外,信息線程顯示僅創建2個線程。但是,我正在努力創造100個。另外,我必須在我的情況下使用pthread_join()函數嗎?驗證碼:有使用線程的多個文件訪問

#define NTHREADS 100 
void *encrypt(void *args) 
{ 
    int count = *((int*) args); 
    AES_KEY enc_key; 
    AES_set_encrypt_key(key, 128, &enc_key); 

    int i; 

    for(i=1;i<=count;i++){ 

    char *ifile; 
    char *ofile; 
    long length; 
    size_t result; 
    char * buffer; 

    sprintf(ifile,"random_files/random_%d.txt",i); 
    FILE *ifp = fopen(ifile,"rb"); 

    if (ifp==NULL) {fputs ("File error",stderr); exit (1);} 

    fseek(ifp,0, SEEK_END); 
    length = ftell(ifp); 
    fseek (ifp,0, SEEK_SET); 

    buffer = (char*) malloc (sizeof(char)*length); 
    if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);} 
    result = fread (buffer, 1, length, ifp); 
    if (result != length) {fputs ("Reading error",stderr); exit (3);} 
    printf("%s",buffer); 
    fclose (ifp); 
    free(buffer); 
    } 
} 
int main(){ 
int i,j,count =0; 
pthread_t threads[NTHREADS]; 

for (i=0; i<NTHREADS; i++){ 
    count = count +20; 
    int *count_ptr = &count; 
    if(pthread_create(&threads[i], NULL, encrypt, count_ptr)!=0){ 
      fprintf(stderr, "error: Cannot create thread # %d\n", i); 
      break; 
     } 
} 

printf("After Thread\n"); 
exit(0); 
} 
+1

1.在follow-for循環中加入你的線程。 2.你有一個競爭條件。主循環中相同的'count',隨着每個循環迭代而改變,正在通過* all *你的線程來解決。您發送的地址相同*全部*。 3. *驗證返回結果*。 – WhozCraig

+0

@WhozCraig感謝您的評論。是否有可能發送不同的計數值到每個新線程的加密函數? –

回答

1

是的,你應該加入你的線程,因爲沒有任何東西被創建分離(並且你可能不夠深入學習pthreads來處理這個問題)。

這就是說,你的線程參數有一個重要的邏輯問題。他們是全部得到的地址相同count變量main。可能是最快的方式來改變這種狀況沒有改變你的線程PROC僅僅是站起來並排側陣列的int counts[NTHREADS]匹配你的線程,使用每個元素作爲相應的線程的數據PARAM:

int main() 
{ 
    pthread_t threads[NTHREADS]; 
    int counts[NTHREADS]; // HERE 
    int i,j,count =0; 

    for (i=0; i<NTHREADS; i++) 
    { 
     counts[i] = (count += 20); 
     if(pthread_create(&threads[i], NULL, encrypt, counts+i)!=0) // LAST PARAM 
     { 
      fprintf(stderr, "error: Cannot create thread # %d\n", i); 
      break; 
     } 
    } 

    for (i=0; i<NTHREADS; ++i) 
     pthread_join(threads[i], NULL)); 

    return EXIT_SUCCESS; 
} 

或者,你可以做一些動態的分配環節,或者通過intptr_t發送值,轉換爲void*,但是上面顯示的方法的優點是不需要對你的線程進程進行修改,我希望的目標是。

我已經在你的線程proc中留下了任何問題給你解決,但至少應該讓你在線程堆棧上運行。

1

缺少的東西在代碼中,首先,在你的加密功能,你需要在年底前關閉線程,並在主函數中,但在此之前的話,你的循環後,你需要加入他們,然後他們將被正確處理和關閉。

的流動將是這樣的:

(void) pthread_join(th1, NULL); 
(void) pthread_join(th2, NULL); 

你可以把他們都在通過TID加入他們的行列。

另一個更新:沒有什麼「隨機」的事情發生,我只是開始根據其tid打開文件,然後添加其他大的實現,你的樣子會嘗試打開文件像瘋了一樣,它應該無論如何工作,只是說。