Использование pthread не печатало ожидаемое значение - PullRequest
0 голосов
/ 21 мая 2018

Я создал следующую программу:

void *thread(void *vargp) {
  int *ptr = (int*)vargp;
  printf("vargp = %p, *vargp = %d\n",vargp, *(int*)vargp);
  pthread_exit((void*)*ptr);
}

void *thread2(void *vargp) {
  int *ptr = (int*)vargp;
  *ptr = 0;
  pthread_exit((void*)31);
}

int main(){
  int i = 42;
  pthread_t tid, tid2;
  pthread_create(&tid, NULL, thread, (void*)&i);
  printf("i = %d, &i = %p\n", i, &i);
  pthread_create(&tid2, NULL, thread2, (void*)&i);
  pthread_join(tid, (void**)&i);
  pthread_join(tid2, NULL);
  printf("at the end i = %d\n",i);
}

Я ожидаю, что последний printf в основной функции напечатает «в конце i = 42».Однако он печатает следующее:

i = 42, &i = 0x7ffcf3b65c4c
vargp = 0x7ffcf3b65c4c, *vargp = 0
0

Поскольку vargp получает тот же адрес, что и переменная i, почему * vargp не выводит значение 42, а значение 0?

1 Ответ

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

Поскольку vargp получает тот же адрес, что и переменная i, почему * vargp не распечатывает значение 42, а значение 0?

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

Если вы хотите гарантировать, что thread будет работать до thread2, вам нужно дождатьсяэто (через pthread_join) до создания thread2.

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