2014-03-27 32 views
1

假設我們有一個長度爲256(可以更多或更少)的數組或向量,並且生成的pthread數爲4(可以更多或更少)。使用pthreads處理數組/矢量的部分

我需要弄清楚如何將每個pthread分配給一個進程的一部分向量。

所以下面的代碼調度多個線程。

for(int i = 0; i < thread_count; i++) 
{ 
    int *arg = (int *) malloc(sizeof(*arg)); 
    *arg = i; 
    thread_err = pthread_create(&(threads[i]), NULL, &multiThread_Handler, arg); 

    if (thread_err != 0) 
       printf("\nCan't create thread :[%s]", strerror(thread_err)); 
} 

正如可以從上面的代碼告訴,每個線程傳遞一個參數值來起動功能。在四個線程的情況下,參數值範圍從0到3,5個線程= 0到4等等。

現在開始功能執行以下操作:

void* multiThread_Handler(void *arg) 
{ 
    int thread_index = *((int *)arg); 

    unsigned int start_index = (thread_index*(list_size/thread_count)); 
    unsigned int end_index = ((thread_index+1)*(list_size/thread_count)); 

    std::cout << "Start Index: " << start_index << std::endl; 
    std::cout << "End Index: " << end_index << std::endl; 
    std::cout << "i: " << thread_index << std::endl; 

    for(int i = start_index; i < end_index; i++) 
    { 
     std::cout <<"Processing array element at: " << i << std::endl; 
    } 

} 

所以在上面的代碼中,其參數的線程是0應該處理部0 - 63(在256和陣列尺寸的情況下線程數爲4),參數爲1的線程應該處理64-127部分,等等。最後一個線程處理192 - 256.

這四個部分的每一個都應該並行處理。

此外,pthread_join()函數存在於原始主代碼中,以確保每個線程在主線程終止之前完成。

問題是,上述for循環中的值i會帶有可疑的大值。我不確定爲什麼會出現這種情況,因爲我對pthreads相當陌生。

它似乎有時會很好地工作,其他時間和其他時間,我的價值變得如此之大,它會導致程序中止或呈現分段錯誤。

+0

我看到兩個變量list_index和thread_index,我看到thread_index被聲明在哪裏是list_index定義? – Ravi

+0

'*((int *)arg)' - 這是否正確?你投到一個int指針,然後指向指針? – DumbCoder

+0

@DumbCoder對我來說看起來是正確的。 *版本以外的*用於在演員播放後取消參考指針。 – Ravi

回答

0
// Incorrect Code 
    unsigned int start_index = (thread_index*(list_size/thread_count)); 
    unsigned int end_index = ((thread_index+1)*(list_size/thread_count)); 

上述代碼在上述程序中是關鍵區域錯誤。因爲沒有使用同步機制,因此存在數據競爭。這導致start_index和end_index計數器的計算錯誤,因此我們可能會出錯(隨機垃圾值),因此for循環變量「i」繼續折騰。所以你應該使用下面的代碼來同步程序的關鍵區域。

// Correct Code 
    s=thread_mutex_lock (&mutexhandle); 
    start_index = (thread_index*(list_size/thread_count)); 
    end_index = ((thread_index+1)*(list_size/thread_count)); 
    s=thread_mutex_unlock (&mutexhandle); 
+1

數據競賽在哪裏? 'start_index'和'end_index'是唯一寫入的變量,而這些變量是線程本地的。 'list_size'和'thread_count'沒有被修改,並且可以被多個線程安全地讀取(除非在問題中沒有顯示的代碼中同時修改)。 –

3

問題確實是由於缺乏同步引起的數據競爭。而多線程使用(和修改)的共享變量是std::cout

同時使用諸如std::cout這樣的流時,您需要通過互斥鎖同步所有操作與流。否則,根據平臺和你的運氣,你可能會將多個線程的輸出混淆在一起(有時看起來打印值比你預期的要大),否則你可能會讓程序崩潰,或者有其他種類的未定義行爲。

+0

這對於打印值顯示較大的原因是正確的。謝謝。 – user1349206