다중 스레드 응용 프로그램 (여러 스레드가 동시에 변수 데이터를 변경하려고하는)에서 전역 변수 내용을 안전하게 변경할 수 있도록 스레드를 동기화해야한다는 것을 알고 있습니다. 그러나 전역 배열을 사용하는 경우에도이 작업이 필요합니다. 각 스레드는 n 개의 요소 중 하나만 사용합니다.스레드의 전역 배열
미리 감사드립니다.
다중 스레드 응용 프로그램 (여러 스레드가 동시에 변수 데이터를 변경하려고하는)에서 전역 변수 내용을 안전하게 변경할 수 있도록 스레드를 동기화해야한다는 것을 알고 있습니다. 그러나 전역 배열을 사용하는 경우에도이 작업이 필요합니다. 각 스레드는 n 개의 요소 중 하나만 사용합니다.스레드의 전역 배열
미리 감사드립니다.
각 스레드가 하나의 요소 만 사용하고 메모리의 배열 위치가 변경되지 않으면 동기화없이 절대적으로 안전합니다.
데이터를 실제로 공유하지 않는 경우 동기화 할 필요가 없습니다. 즉, 상황이 올바르게 작동하는 것처럼 보일지라도 성능 저하를 일으킬 수 있기 때문에 잘못된 공유 (특정 캐시 라인이 여러 코어에서 다른 코어에서 사용되는 경우)에 유의하십시오. 배열에서 데이터를 읽는 중이라면 문제가되지 않습니다.
스레드가 배열을 변경하지 않는 경우 스레드로부터 안전하다고 생각할 수 있습니다. 그러나 두 개의 스레드가 동일한 배열 요소에 액세스하는 경우 경쟁 조건에 유의해야합니다.
귀하의 경우 동기화를위한 필요없이, 당신은 요소
스레드가 하나의 배열 요소에 액세스하려고하는 경우에 대한 하나 개의 스레드에 의해서만 수행되어 있는지 읽기 \ 쓰기 작업을해야 할 필요가 없다 모든 동기화. 그러나 마음이 바뀌고 모든 스레드가 배열의 모든 요소에 액세스하기를 원할 가능성이 높습니다. 따라서이 경우 다음 프로그램을 참조하십시오!
#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;
}
안녕하세요. – vdbuilder
각 스레드가 하나의 요소와 하나의 요소 만 접촉한다는 보장을하면 – fge