Sleep() завершает поток в WindRiver

Я должен написать небольшую программу на C с WindRiver, которая создает три потока:

  • Поток № 1: создает случайное число
  • Поток № 2: убить № 3, если случайное число меньше 25
  • Поток № 3: убить #2, если случайное число больше 25

Чтобы убить поток, я хочу подождать, чтобы убедиться, что он создан, поэтому я обнаружил, что могу использовать sleep() позволить другому потоку вступить во владение и позволить ему создать себя. Но все они умирают со сном.

Я придумал этот код:

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

#define NUM_THREAD 3

int theRandomNumber = 0;

void *RandomNumber (void *threadid){
    int id = (int) threadid;
    //srand();
    theRandomNumber = rand() % 50; 
    printf("Thread %d: Random: %d \n", id, theRandomNumber);
    pthread_exit(NULL);
    return 0;
}

void *CheckNumber (void *threadid){
  int id = (int) threadid;
  printf("Thread #%d is active and going to sleep now\n", id);
  sleep(1000);
  //here he dies without annoucing anything or something
  printf("Thread #%d is active again and back from sleep\n", id);
  if (id == 1){
      if (theRandomNumber >= 25){
          pthread_cancel(2);
          printf("THREAD %d: Thread #2 is closed \n", id);
      }
  }
  else{
      if (theRandomNumber < 25){
          pthread_cancel(1);
          printf("THREAD %d: Thread #1 is closed \n", id);
      }
  }
  return 0;
}


int main (int argc, char *argv[]){
  pthread_t threads[NUM_THREAD];
  int t = 0;

  printf("in main: create thread #%d \n", t);
  pthread_create (&threads[t], NULL, RandomNumber, (void *) t++);

  printf("in main: create thread #%d \n", t);
  pthread_create (&threads[t], NULL, CheckNumber, (void *) t++);

  printf("in main: create thread #%d \n", t);
  pthread_create (&threads[t], NULL, CheckNumber, (void *) t++);
}

Часть с Randomnumber работает отлично, я оставил здесь, но я могу опубликовать его по запросу.

После того, как нить достигает sleep()Заканчивается.

Журнал консоли:

в основном: создать тему № 0
в основном: создать тему # 1
в основном: создать тему № 2
Тема № 0: Случайная: 8
Тема № 1 активна и сейчас идет спать
Тема № 2 активна и сейчас идет спать

Ничего не происходит после сна. Есть идеи?

1 ответ

Решение

Покидать main() позвонив pthread_exit(), чтобы выйти только из "основного" потока, иначе окончание main() завершает процесс и этим все остальные потоки.

В качестве альтернативы main() присоединиться ко всем темам с помощью звонка pthread_join() на каждом PThread-id, возвращаемом вызовами pthread_create(),

Другие вопросы по тегам