2011-12-31 6 views
3

複数のスレッドが同時に変数データを変更しようとしているマルチスレッドアプリケーションで、グローバル変数の内容を安全に変更できるようにスレッドを同期させる必要があることは知っています。しかし、これは、グローバル配列を使用する場合にも必要です。各スレッドはn個の要素のうちの1つだけを使用します。スレッド内のグローバル配列

ありがとうございます!

+0

ようこそ。 – vdbuilder

+0

各スレッドが1つの要素と1つの要素にしか触れないことを保証する場合は、 – fge

答えて

5

各スレッドが1つの要素しか使用せず、メモリ内の配列の場所が決して変更されない場合、同期なしでは絶対に安全です。

2

データが実際に共有されていない場合は、同期は必要ありません。つまり、状況が正しく動作しているように見えても、パフォーマンスの低下を招く可能性があるため、誤った共有(別のコアの複数のスレッドが特定のキャッシュラインを使用している場合)に注意してください。配列からデータを読み取っているだけであれば、それほど大きな問題ではありません。

0

スレッドが配列を変更していない場合は、スレッドセーフと見なすことができます。しかし、2つのスレッドが同じ配列要素にアクセスする場合、競合条件に注意する必要があります。

0

あなたのケースでは、同期は必要ありません、あなたは要素

1

スレッドが唯一の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; 
} 
関連する問題