线程中的全局数组

时间:2011-12-31 23:16:28

标签: c multithreading thread-safety

我知道你必须同步你的线程才能在多线程应用程序中安全地更改全局变量内容(多个线程试图同时更改变量数据)。但是如果你使用全局数组,这也是必要的,其中每个线程只使用n个元素之一吗?

提前致谢!

5 个答案:

答案 0 :(得分:5)

如果每个线程只使用一个元素,并且数组在内存中的位置永远不会改变,那么没有同步就绝对安全。

答案 1 :(得分:2)

不,如果实际上没有共享数据,则不需要同步。也就是说,要注意虚假共享(其中给定的缓存行由不同核心上的多个线程使用),因为即使事情似乎正常工作,这也会导致性能下降。如果您只是从数组中读取数据,那么这不是一个问题。

答案 2 :(得分: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;
}

答案 3 :(得分:0)

如果没有线程正在更改阵列,您可能会认为它是线程安全的。但是,如果两个线程访问相同的数组元素,您应该注意竞争条件。

答案 4 :(得分:0)

在您的情况下不需要同步,您必须确保只对一个元素的一个线程执行read \ write操作