如何停止正在运行的pthread线程?

xDi*_*dex 5 c multithreading pthreads

如何立即退出或停止线程?

当用户输入答案时,如何立即停止?我想让它重置每一个问题.

这是涉及线程的代码

int q1() {
    int timer_start;
    char ans[] = "lol";
    char user_ans[50];
    timer_start = pthread_create( &xtimer,NULL,(void*)timer_func,(void*)NULL);
    printf("What is the capital city of Peru?\n");

    while(limit){
        scanf("%s",user_ans);
        if(limit)
        {
             if(!strcmp(user_ans, ans))
              {

               // printf("YAY!\n");
                score++;
               // q2();

            }
            else
            {
                game_over();
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Nar*_*uil 9

您可以简单地调用pthread_cancel该线程退出它.您可以通过发送SIGSTOP/SIGCONT信号pthread_kill来停止/重启它.


但如果你想要的只是一个计时器,你为什么要穿线?


Dar*_*usz 9

根据您的代码,我可以给出一个简单的答案:

在这种情况下,根本不要使用线程.

你不需要它们.存储开始时间,让用户回答,在用户给出答案后再次检查时间.

{
  time_t startTimeSec = time(NULL);

  // answering

  time_t endTimeSec = time(NULL);
  time_t timeTakenSec = endTime-startTime;
  if (timeTaken > 10) { 
    // do your thing
  }
}
Run Code Online (Sandbox Code Playgroud)

回答你的问题:

您应该使用互斥保护或volatile变量来在线程之间进行异步通信.从一个线程设置该变量并在另一个线程中检查它.然后重置其值并重复.一个简单的片段:

int stopIssued = 0;
pthread_mutex_t stopMutex;

int getStopIssued(void) {
  int ret = 0;
  pthread_mutex_lock(&stopMutex);
  ret = stopIssued;
  pthread_mutex_unlock(&stopMutex);
  return ret;
}

void setStopIssued(int val) {
  pthread_mutex_lock(&stopMutex);
  stopIssued = val;
  pthread_mutex_unlock(&stopMutex);
}
Run Code Online (Sandbox Code Playgroud)

使用pthread_cancel()是一种选择,但我不建议这样做.在此调用返回后,您必须检查线程状态,因为pthread_cancel()不等待实际的线程停止.对我来说更重要的是,我认为使用它很难看.

  • @xDianneCodex:如果您所做的只是计时用户需要多长时间才能回答,Dariusz肯定是对的.使用线程将是麻烦且低效的.有点像使用第二辆汽车跟踪一辆汽车的行驶距离,当时两辆汽车都有里程表.*你只需要检查第一辆汽车的里程表.第二个是完全多余的. (6认同)

小智 5

使用方法来停止线程是一种粗暴的方法。您应该通过发出信号来礼貌地要求线程停止。因此,线程将可以选择在其自身之后进行整理,例如,如果它已分配内存,则如果线程被取消,它将没有任何机会执行此操作。

该方法相对简单,不包含操作系统信令:

在线程外部定义线程状态变量或结构。在 pthread_create 处指向它并取消引用线程中的状态变量。

int thread_state = 0; // 0: normal, -1: stop thread, 1: do something

static void *thread_1 (void *arg)
{
   int* pthread_state = arg;
   ... // initialize the thread locals
   while(1)
   {
      switch( *pthread_state )
      {
      case 0: // normal thread loop
         ...
         break;
      case -1:
         ... // tidy or whatever is necessary
         pthread_exit(0); // exit the thread signalling normal return
         break;
      case 1: //
         ... // do something special
         break;
      }
   }
}

pthread_create (&t_1, NULL, thread_1, (void*)&thread_state);

...

thread_state = -1; // signal to the thread to stop

// maybe use pthread_exit(0) to exit main.
// this will leave the threads running until they have finished tidy etc.
Run Code Online (Sandbox Code Playgroud)

甚至可以使用结构与线程通信,只要它是简单的“原子”变量或建立简单的握手机制。否则可能需要使用互斥体。使用 pthread_join 等待线程终止。