Предотвращение конфликтов памяти с помощью pthreads - PullRequest
0 голосов
/ 05 ноября 2018

Я новичок в pthreads и пытаюсь понять, что можно сделать, чтобы избежать проблем при использовании одновременных потоков для записи в одни и те же глобальные переменные. Вот самый простой пример:

pthread_t tid1, tid2 ;

int sum = 0 ;

void process()
{
  for (int i ; i<100; i++)
    sum += 1 ;
}

int main()
{

  pthread_create(&tid1, NULL, (void *) process,  NULL ) ;
  pthread_create(&tid2, NULL, (void *) process,  NULL ) ;

  pthread_join(tid1, NULL) ;
  pthread_join(tid2, NULL) ;

  printf("Sum = %d\n", sum) ;
}

Когда я выполняю этот код, он иногда печатает 200, а иногда печатает 100, подразумевая, что в последнем случае я предполагаю, что оба потока пытались записать в «сумму» в одно и то же время, и один поток был заблокирован.

В моем приложении реального мира 'sum' может быть большим массивом, и один поток может пытаться обновить один элемент, в то время как другой обычно пытается обновить другой элемент того же массива.

Какой самый простой / чистый способ обеспечить успешное выполнение всех запланированных операций чтения / записи для глобальной переменной или массива или, по крайней мере, для проверки успешности операции? Нет необходимости сохранять порядок операции.

1 Ответ

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

Кажется, я нашел ответ - раньше я не знал о мьютексе, пока он не был упомянут в ответе на другой вопрос:

pthread_t tid1, tid2 ;
pthread_mutex_t lock;

int sum = 0 ;

void process()
{
  for (int i ; i<100; i++) {
    pthread_mutex_lock(&lock);
    sum += 1 ;
    pthread_mutex_unlock(&lock);
  }
}

int main()
{
  if (pthread_mutex_init(&lock, NULL) != 0)
    {
      printf("\n mutex init failed\n");
      return 1;
    }

  pthread_create(&tid1, NULL, (void *) process,  NULL ) ;
  pthread_create(&tid2, NULL, (void *) process,  NULL ) ;

  pthread_join(tid1, NULL) ;
  pthread_join(tid2, NULL) ;

  pthread_mutex_destroy(&lock);

  printf("Sum = %d\n", sum) ;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...