многопоточный в одноядерный и двухъядерный - PullRequest
0 голосов
/ 26 мая 2018

Я сейчас изучаю многопоточное программирование

Однако у меня возник вопрос по поводу чтения компьютерных систем: взгляд программистов, автором которого является Брайант

, badcnt.c записывается как

#include "csapp.h"

void *thread(void *vargp);
volatile long cnt = 0;
int main(int argc, char **argv){
  long niters;
  pthread_t tid1, tid2;

  niters = atoi(argv[1]);
  Pthread_create(&tid1, NULL, thread, &niters);
  Pthread_create(&tid2, NULL, thread, &niters);
  Pthread_join(tid1, NULL);
  Pthread_join(tid2, NULL);

  printf("cnt = %ld\n", cnt);
}

void *thread(void *vargp){
  long i;
  long niters = *((long *) vargp);
  for(i = 0; i < niters; i++) cnt++;

  return NULL;
}

Я знаю, что в унипроцессоре машинные инструкции выполняются одна за другой в некотором порядке, поэтому результат cnt может быть от 10 до 20.

У меня вопрос

Может ли диапазон результатов cnt отличаться от 10 до 20 в двухъядерном процессоре?

В простых размышлениях я так не думаю, но хочу услышать многих людеймнение.

Спасибо

1 Ответ

0 голосов
/ 26 мая 2018

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

Вам нужно погрузиться в детали реализации, чтобы понять, что на самом деле происходит, и вы не хотите ... (и вы, вероятно, не можете понять все детали).

На практике вы, вероятно, используете какую-то операционную систему, например Linux (или другую POSIX, например MacOSX).Существует более двух выполняемых задач (проверьте с помощью top, htop, ps; представьте себе ситуацию thrashing ), и планировщик ядра может выбрать любую из них для каждого ядра (в моем Linuxна рабочем столе присутствует более 200 процессов, большинство из них обычно - но не всегда - простаивают).Таким образом, вы не можете предсказать, что произойдет.Чтобы узнать больше, прочитайте Операционные системы: Three Easy Pieces .

Прочитайте некоторое Руководство по pthread .Кстати, обратите внимание, что все имена функций Pthread начинаются с pthread_ в в нижнем регистре .

Конкретно, ваша интуиция (cnt между 10 и 20), вероятно, хорошая.Но у вас нет гарантии.Детали зависят от слишком многих вещей: архитектура и модель набора команд процессора (которые могут отличаться для AMD и Intel), его кэш, флаги компилятора и оптимизации, сгенерированный машинный код, ваша операционная система, другие процессы, выполняемые на вашем компьютере.машина, прерывания (например, от таймеров, пакетов внешней сети, движения мыши, ...) и т. д.

...