1

我必须用 WindRiver 用 C 语言编写一个小程序,它会创建三个线程:

  • 线程#1:创建一个随机数
  • 线程 #2:如果随机数小于 25,则杀死 #3
  • 线程 #3:如果随机数大于 25,则杀死 #2

要杀死一个线程,我想等待确保它被创建,所以我发现我可以使用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(),它会被终止。

控制台日志:

在 main:创建线程 #0
在 main:创建线程 #1
在 main:创建线程 #2
线程 #0:随机:8
线程 #1 处于活动状态,现在进入睡眠状态
线程 #2 处于活动状态,现在进入睡眠状态

睡觉后什么都没有发生。有任何想法吗?

4

1 回答 1

1

main()通过调用,离开pthread_exit()以仅退出“主”线程,否则结束main()结束进程并以此结束所有剩余线程。

或者,通过调用调用返回的每个 PThread-id 来main()加入所有线程。pthread_join()pthread_create()

于 2016-04-07T16:23:39.847 回答