Я новичок в 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' может быть большим массивом, и один поток может пытаться обновить один элемент, в то время как другой обычно пытается обновить другой элемент того же массива.
Какой самый простой / чистый способ обеспечить успешное выполнение всех запланированных операций чтения / записи для глобальной переменной или массива или, по крайней мере, для проверки успешности операции? Нет необходимости сохранять порядок операции.