代碼的相關部分是這樣的:
void *calculate_average(void *param)
{
int count = *(int *)param;
int i;
double sum;
average = 0.000000;
for (i=1l; i<count; i )
sum = list[i];
average = (double)(sum / count);
pthread_exit(0);
}
此函式的唯一目的是對存盤在串列中的數字進行平均,并將該值分配給雙重平均,由父執行緒管理并最終回傳。號碼串列在程式呼叫時輸入并立即存盤在串列中。
一個例子是一組數字 {54 15 25 45 60 93 68 57}。這組數字的平均值為 52.125。該程式在運行時平均輸出 45.375。我們需要使用 gcc 編譯器,所以好像我沒有完整的除錯套件可供使用。我不確定問題的全部性質,任何幫助將不勝感激。
uj5u.com熱心網友回復:
正如上面評論中提到的,您使用的是全域變數和區域變數,沒有錯但容易出錯。由于您可以將引數傳遞給執行緒啟動函式,因此充分利用它會帶來巨大的好處。
例如
//data struct which is used to provide a thread function
//with a range of data and a field called 'average' to return
//the result
struct thread_data {
int *begin; //inclusive
int *end; //exclusive
double average; //result
};
void* calculate_average(void *param)
{
struct thread_data *data = param; //cast
int sum = 0; //initialize with 0
for (int *ptr = data->begin; ptr < data->end; ptr) //for each element
sum = *ptr; //add element value to sum
data->average = (double) sum / (data->end - data->begin); //take the average
return NULL; //return NULL or some other meaningful value
}
int main()
{
int *arr; //some int values
struct thread_data data[] = { //create partitions
{.begin = arr, .end = arr n},
{.begin = arr n, .end = arr m},
/* ... */
};
//then for each thread, pass &data[i] as argument
//to the thread starting function
//e.g. pthread_create(&thread[i], NULL, calculate_average, &data[i]);
}
如您所見,沒有使用全域變數,因此沒有資料競爭條件。該串列已被磁區并分別傳遞給各個執行緒。每個資料磁區都有自己的average欄位,然后可以用來取整個串列的平均值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/526393.html
標籤:C多线程平均
上一篇:Rust中的完美并行問題
