2011-12-31 4 views
3

다중 스레드 응용 프로그램 (여러 스레드가 동시에 변수 데이터를 변경하려고하는)에서 전역 변수 내용을 안전하게 변경할 수 있도록 스레드를 동기화해야한다는 것을 알고 있습니다. 그러나 전역 배열을 사용하는 경우에도이 작업이 필요합니다. 각 스레드는 n 개의 요소 중 하나만 사용합니다.스레드의 전역 배열

미리 감사드립니다.

+0

안녕하세요. – vdbuilder

+0

각 스레드가 하나의 요소와 하나의 요소 만 접촉한다는 보장을하면 – fge

답변

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; 
}