2016-03-10 25 views
-1

我正在學習在c中編寫多線程程序,而我剛剛注意到當我增加給定線程的迭代次數時,每次操作的成本都下降了。多線程平均每次操作的成本

例如,如果我有2個線程,並且每個向全局變量添加一個數字,然後減去相同的數字,如果每個線程都這樣做了1000次,可以說每次操作的成本比每個線程的成本高得多這1000000次。爲什麼是這樣 ?

static int num_iterations = 1; 
int opt_yield=0; 

    void add(long long *pointer, long long value) { 
     long long sum = *pointer + value; 
     if (opt_yield) 
      pthread_yield(); 
     *pointer = sum; 
    } 


struct arg_struct { 
    long long counter; 
    long long value; 
}; 



void *aux_add(void *arguments) 
{ 

    struct arg_struct *args = arguments; 
    int i=0; 
    for (i=0;i<num_iterations;i++) 
    { 
    args->value = 1; 
    add(&args->counter,args->value); 
    args->value = -1; 
    add(&args->counter,args->value); 
    } 
} 


int main(int argc, char * argv[]) 
{ 
    printf("\n\n"); 
    int num_threads = 2; 

    pthread_t t[num_threads]; 


struct arg_struct args; 
args.counter = 0; 



int count=0; 
for(count=0;count<num_threads;count++) 
{ 
    if(pthread_create(&threads[count],NULL,&aux_add, (void *) &args) !=0) 
    exit(); 
} 



for(count=0;count<num_threads;count++) 
{ 
    pthread_join(threads[count], NULL); 
} 


    return 0; 
} 
+1

每個線程是否改變自己的gloabl變量或者它們使用相同的全局變量?你使用一些同步對象(如互斥體)?或者,也許你的全局變量是原子類型?你可以發佈你的代碼嗎? – Unick

+0

請顯示您用於測試的代碼。 –

+0

我目前沒有使用任何同步方法,因爲我的目標實際上是調查競爭條件並瞭解它們是如何工作的。 –

回答

3

很簡單,因爲線程的創建破壞不是免費的 - 它需要在操作系統的開銷。線程消耗的時間越多實際上工作,開銷(這是常數)的相關性越低,則適用於整體運行時間。