2011-05-20 158 views
1

我正在用C編寫一個程序來計算某些網站的訪問時間。 sitenames存儲在urls數組的每個元素中。如果我取出for(y = 0; y <迭代; y ++)循環,那麼一切運行良好。但如果我保留它。第一個網站urls [0]在第二個for循環完全結束並遞增後變得混亂yfor循環中的線程

這是什麼原因造成的?

char *urls[50]; char str1[20]; 

void *wget(void *argument) 
{ 
    int threadid; 
    threadid = *((int *)argument); 
    strcpy(str1, "wget -q --spider "); 
    strcat(str1, urls[threadid]); 
    system(str1); 
} 


for (y = 0; y < iterations; y++) 
{ 
    for (j = 0; j < numthreads; j++) 
    { 
     thread_args[j] = j; 

     clock_gettime(CLOCK_REALTIME, &bgn); 
     rc = pthread_create(&threads[j], NULL, wget, (void *) &thread_args[j]); 
     rc = pthread_join(threads[j], NULL); 
     clock_gettime(CLOCK_REALTIME, &nd); 
     times[j] = timediff(bgn,nd); 
    } 
} 
+0

你爲什麼要創建一個線程,然後馬上加入呢?這是浪費,可能會減慢你的時間。 – WirthLuce 2011-05-20 01:44:41

+2

不只是浪費,它使線程完全沒有意義。你可以用'wget(&thread_args [j]);' – 2011-05-20 02:24:00

+0

來代替'pthread_create'和'pthread_join';從吞吐量的角度來看,在一個循環中執行創建以及在一個循環中執行連接會更有意義第二個循環。然後再次,你不需要線程來並行產生一堆子進程 - 在一個循環中''fork()'/'exec()'然後'wait()'讓它們退出。 – bk1e 2011-05-20 03:24:28

回答

5

一些可能性...

str1出現的所有線程之間共享。這是在那裏發生麻煩的祕訣。

str1只有20個字符長。很難相信包括URL在內的整個wget命令行將少於20個字符。所以你寫下str1的結尾。

考慮制定str1一個局部變量wget(),並且無論是使其基礎上,長度大小的字符數組大到足以應付你可能有儘可能大的wget命令行,或者動態分配,並釋放它內wget()命令行常量部分和當前URL。

+0

^對於第一個,是的,但我調用了一個pthread_join()來等待每個線程完成,因此不會有與str1的資源衝突,對吧? – John 2011-05-20 01:41:45

3

我敢打賭,urls + wget字符串中的一個字符串長於20個字節,正在覆蓋該數據。使str1變大,並將其移動到您的wget函數中(多個線程不應寫入未鎖定的共享資源)。

+0

謝謝你們,str1是個問題。我把它改成了str1 [200],它沒有用完房間! – John 2011-05-20 01:55:47