当线程处于睡眠状态且需要正常关闭时,如何使用pthread_join、pthread_exit或pthread_cancel?

当线程处于睡眠状态且需要正常关闭时,如何使用pthread_join、pthread_exit或pthread_cancel?,c,linux,pthreads,sleep,C,Linux,Pthreads,Sleep,我有一个线程运行,而条件和它有2分钟的睡眠。 i、 e 为了优雅地终止线程,我使用pthread_join并将while条件设置为false,例如someflag=0 终止线程是可行的,但是如果线程正在睡眠,它在睡眠结束之前不会终止 这是我需要避免的问题;即使线程处于睡眠状态,我也需要让它提前出来。这可能不是正确的答案,但是我可以建议一种变通方法,将120秒的睡眠时间缩短为2秒,并将其放入循环中。每次循环执行时,您都可以检查条件,例如 while (condition) { //do so

我有一个线程运行,而条件和它有2分钟的睡眠。 i、 e

为了优雅地终止线程,我使用pthread_join并将while条件设置为false,例如someflag=0

终止线程是可行的,但是如果线程正在睡眠,它在睡眠结束之前不会终止


这是我需要避免的问题;即使线程处于睡眠状态,我也需要让它提前出来。

这可能不是正确的答案,但是我可以建议一种变通方法,将120秒的睡眠时间缩短为2秒,并将其放入循环中。每次循环执行时,您都可以检查条件,例如

while (condition)
{
  //do something

  int i = 0;
  while(condition && (60 > i))
  {
    sleep (2);
    i++;
  }
}

我希望有人肯定会贴出更好的答案。

这可能不是正确的答案,但是我可以建议一种变通方法,将120秒的睡眠时间缩短为2秒,然后循环使用。每次循环执行时,您都可以检查条件,例如

while (condition)
{
  //do something

  int i = 0;
  while(condition && (60 > i))
  {
    sleep (2);
    i++;
  }
}

我希望有人一定会贴出更好的答案。

以上都没有。而不是在120;您应该使用条件变量:

while (condition) {
    ...
    pthread_cond_timedwait(&condvar, &mutex, &abstime);
    ...
}

我选择了pthread_cond_timedwait,假设您实际上需要每隔120秒醒来并做一些事情,即使没有人向您发出信号,但如果没有,您可以使用pthread_cond_wait。信令线程需要在更改条件后调用pthread_cond_signal&condvar,当然,所有访问读取和写入条件所依赖的状态都需要由互斥锁(mutex)保护。在调用pthread_cond_[timed]wait时,必须保持互斥锁。如果您有关于如何使用条件变量的更多问题,请搜索现有的问题/答案(有很多问题/答案),或者询问后续问题。

以上所有问题都没有。而不是在120;您应该使用条件变量:

while (condition) {
    ...
    pthread_cond_timedwait(&condvar, &mutex, &abstime);
    ...
}

我选择了pthread_cond_timedwait,假设您实际上需要每隔120秒醒来并做一些事情,即使没有人向您发出信号,但如果没有,您可以使用pthread_cond_wait。信令线程需要在更改条件后调用pthread_cond_signal&condvar,当然,所有访问读取和写入条件所依赖的状态都需要由互斥锁(mutex)保护。在调用pthread_cond_[timed]wait时,必须保持互斥锁。如果您有关于如何使用条件变量的更多问题,请搜索现有的问题/答案(有很多问题/答案)或询问后续问题。

如果有,向线程发送信号。您在哪个平台上?如果您的正常关机符合pthread_cleanup_push/pthread_cleanup_pop,您可以使用pthread_cancel终止线程,前提是可取消性已启用且是异步的。如果可用,请向线程发送一个信号。您在哪个平台上?如果您的正常关机符合pthread_cleanup_push/pthread_cleanup_pop,您可以使用pthread_cancel终止线程,前提是启用了可取消性且是异步的。您写入:更改条件后,当然,所有访问都会读写到条件所依赖的状态,需要使用互斥锁进行保护,互斥锁。你是指循环的条件还是线程的condvar?我是指循环的条件。如果它根据其他线程所做的事情进行更改,则所有访问都必须由互斥体控制。您可以这样写:在更改条件之后,当然,所有访问都会读写到条件所依赖的状态,需要由互斥体(mutex)保护。你是指循环的条件还是线程的condvar?我是指循环的条件。如果它基于其他线程所做的事情而改变,那么所有访问都必须由互斥锁控制。