2011-12-31 72 views
3

我知道你必須同步你的線程才能在多線程應用程序(其中多個線程同時嘗試更改變量數據)中安全地更改全局變量內容。但是,如果使用全局數組,每個線程只使用n個元素之一,這也是必要的嗎?線程中的全局數組

在此先感謝!

+0

歡迎來到SO。 – vdbuilder 2011-12-31 23:19:22

+0

如果你保證每個線程只接觸一個和一個元素,那麼肯定 – fge 2011-12-31 23:19:23

回答

5

如果每個線程只使用一個元素,並且數組在內存中的位置永遠不會改變,那麼在沒有同步的情況下它是絕對安全的。

2

不,如果數據未實際共享,則不需要同步。也就是說,要小心虛假共享(在不同內核上的多個線程正在使用給定緩存行的情況下),因爲即使情況似乎正常,這會導致性能下降。如果你只是從數組中讀取數據,這不是一個問題。

0

如果沒有線程正在改變數組,你可能認爲它是線程安全的。但是,如果兩個線程訪問相同的數組元素,則應注意競態條件。

0

沒有必要在你的情況下同步,您必須確保的讀\寫操作是由一個線程元素

1

如果一個線程打算只訪問一個數組元素才執行,沒有必要用於任何同步。但更有可能你會改變你的想法,並希望所有的線程訪問數組的所有元素。那麼在這種情況下,下面的程序將會很好的引用你!

#include <stdio.h> 
#include <stdlib.h> 
#include <pthread.h> 

#define NOTHREADS 5 

/* 
The following are the critical sections. 
(1) array 
(2) array index 
*/ 
int arr[10 * NOTHREADS]; 
int aindex; 

pthread_mutex_t mutex; 

void *hello(void *thread_id) 
{ 
     int i; 
     int *id = (int *) thread_id; 

     for (i=1; i<=10 ; i++) { 
       pthread_mutex_lock(&mutex); 
       arr[aindex] = (*id)*100+ i; 
       sleep(1); 
       aindex = aindex + 1; 
       pthread_mutex_unlock(&mutex); 
     } 

     pthread_exit(NULL); 
} 

int main() 
{ 
     pthread_t tids[NOTHREADS]; 
     int ids[NOTHREADS] = {1, 2, 3, 4, 5}; 
     int ret; 
     long t; 
     int i; 

     pthread_mutex_init(&mutex, NULL);  

     for (i=0 ; i<NOTHREADS; i++) { 
       printf("%d %s - Creating thread #%d \n", __LINE__, __FUNCTION__, i); 
       ret = pthread_create(&tids[i], NULL, hello, &ids[i]); 
       if (ret) { 
         printf("unable to create thread! \n"); 
         exit(-1); 
       } 
     } 

     for (i=0 ; i<NOTHREADS; i++) { 
       pthread_join(tids[i], NULL); 
     } 

     printf("Final array : \n"); 
     for (i=0; i<50; i++) 
       printf("%d ", arr[i]); 
     printf("\n\n"); 

     pthread_mutex_destroy(&mutex); 
     pthread_exit(NULL);  

     return 0; 
}