Как изменить элемент глобального массива для всех потоков, чтобы увидеть - PullRequest
0 голосов
/ 29 ноября 2018

Я создаю программу, которая имеет несколько потоков, используя один и тот же буфер.Я создаю буфер в глобальном формате как int *buffer и динамически объявляю размер в main(), используя malloc.Задача буфера заключается в том, чтобы все потоки использовали этот буфер, и мне было интересно, как каждый поток изменит определенное место в буфере, чтобы все потоки увидели это изменение.

Например:

int *buffer;

int main(int argc, char *argv[]){

    buffer = (int *)malloc(10 * sizeof(int));

}

Теперь мне было интересно, в функции, с которой будет работать pthread, как pthread изменит определенное место в buffer, чтобы все остальные pthreadsувидим это изменение в глобальном массиве buffer.

В функции, которую используют pthreads, я бы просто поменял место нормально?

Например:

void *thread_work(void *unused){

    //beginning code

    buffer[0] = 2;

    //ending code

}

Когда я компилирую с этим кодом, он компилируется нормально, но мне было интересно, все ли pthread-ы теперь будут иметь buffer[0] равным 2.

PS Я буду использовать мьютексные блокировки для синхронизации, чтобы они не были частьюмой вопрос, как я понимаю, как это реализовать.

Спасибо за ваше время!

1 Ответ

0 голосов
/ 29 ноября 2018

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

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

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