我知道你必須同步你的線程才能在多線程應用程序(其中多個線程同時嘗試更改變量數據)中安全地更改全局變量內容。但是,如果使用全局數組,每個線程只使用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;
}
歡迎來到SO。 – vdbuilder 2011-12-31 23:19:22
如果你保證每個線程只接觸一個和一個元素,那麼肯定 – fge 2011-12-31 23:19:23