Глобальные массивы в потоках - PullRequest
3 голосов
/ 01 января 2012

Я знаю, что вы должны синхронизировать свои потоки, чтобы иметь возможность безопасно изменять содержимое глобальных переменных в многопоточном приложении (где несколько потоков пытаются одновременно изменять данные переменных). Но необходимо ли это также, если вы используете глобальный массив, где каждый поток использует только один из n элементов?

Заранее спасибо!

Ответы [ 5 ]

5 голосов
/ 01 января 2012

Если в каждом потоке используется только один элемент, а расположение массива в памяти никогда не изменяется, то это абсолютно безопасно без синхронизации.

2 голосов
/ 01 января 2012

Нет, синхронизация не требуется, если данные фактически не передаются. Тем не менее, остерегайтесь ложного совместного использования (когда данная строка кэша используется несколькими потоками на разных ядрах), поскольку это может привести к снижению производительности, даже если кажется, что все работает правильно. Это не такая большая проблема, если вы просто читаете данные из массива.

1 голос
/ 01 января 2012

Если поток собирается получить доступ только к одному элементу массива, синхронизация не требуется. Но более вероятно, что вы передумаете и захотите, чтобы все потоки получили доступ ко всем элементам массива. Так что в этом случае следующая программа будет для вас хорошим справочником!

#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;
}
0 голосов
/ 01 января 2012

в вашем случае синхронизация не требуется, вы должны убедиться, что операции чтения \ записи выполняются только одним потоком для элемента

0 голосов
/ 01 января 2012

Если ни один поток не изменяет массив, вы можете считать его потокобезопасным. Однако, если два потока обращаются к одному и тому же элементу массива, вам следует остерегаться условий гонки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...