Pthread_join и Pthread_exit в c

#include<stdio.h>
#include<stdlib.h>
#include<pthread.h>

void * function(void *);

main()
{
  pthread_t p[5];
  int j;
  int *arg1[4];
  int arr[5]={1,2,3,4,5};
  for(j=0;j<=4;j++) 
    pthread_create(&p[j],NULL,function,&arr[j]);
  for(j=0;j<=4;j++)
    pthread_join(p[j],(void **)&arg1[j]);
  for(j=0;j<=4;j++)
    printf("\n%d",*arg1[j]);

}

void * function(void *arg)
{
 int *i = (int *) arg;
 pthread_exit(i);
}

Output:
-1498551536
32767
3
4
5

В.1) Всегда печатаются ненужные значения для первых двух значений. Почему это так? пожалуйста, поправьте меня, если что-то здесь не так.

Когда я изменил код, как показано ниже, он правильно печатает 1,2,3,4,5.

  for(j=0;j<=4;j++)
  { 
    pthread_join(p[j],(void **)&arg1[j]);
    printf("\n%d",*arg1[j]);
  }

В.2) каковы различные методы возврата значений из потока? Не могли бы вы суммировать все методы с примерами и объяснить, какому из них следует следовать?


person user1762571    schedule 18.07.2013    source источник


Ответы (1)


ваш arg1 имеет только размер 4, но вы заполняете 5. Установка правильного размера решит вашу проблему.

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

В вашем примере это работает, печатая каждый результат перед присоединением к следующему потоку. Это означает, что вы печатаете до того, как пятый поток перезапишет первое и второе значения (они все еще перезаписываются).

Причина, по которой первые два повреждены, заключается в том, что ваши целые числа, вероятно, 32-битные, а ваши указатели, вероятно, 64-битные. Таким образом, 1 дополнительный указатель испортит следующие две позиции int.

Что касается возврата сложных результатов из потока, pthread_exit возвращает значение void *, а pthread_join получает значение в качестве выходного параметра при возврате.

pthread_join

pthread_exit

Поэтому, если вам нужно вернуть больше, чем примитивное значение, создайте структуру и верните ее.

person xaxxon    schedule 18.07.2013