【问题标题】:How can the thread be closed (pthread library)?如何关闭线程(pthread 库)?
【发布时间】:2011-06-22 09:56:40
【问题描述】:

我有一些代码,大致如下:

pthread_create(thread_timeout, NULL, handleTimeOut, NULL);

void handleTimeOut()
{
  /*...*/
  pthread_cancel(thread_timeout);
  /*...*/
}

但正如我在 pthread 的手册中注意到的,取消必须由另一个线程使用。我尝试改用 pthread_exit() 函数,但这个线程再次挂起......

必须如何正确处理胎面终止?如果函数handleTimeOut()在没有特殊pthread函数的情况下刚刚结束,是否会成功终止?

【问题讨论】:

    标签: c++ c pthreads


    【解决方案1】:

    在不合作的情况下杀死线程是问题的根源。正确的解决方案是允许外部线程请求线程清理和终止,并让线程定期举例说明这种状态,当它被请求时,它会按照请求进行处理。这样的请求可以通过所有线程可以共享的任何东西来完成。

    【讨论】:

    • 应该使用什么函数来终止线程?取消、退出、杀死?
    • 重点是线程A不应该使用任何函数来直接终止线程B...相反,线程A和B需要设计成线程A可以请求该线程 B 自行终止,并且线程 B 将在下一个方便的时间接受该请求。这允许线程 B 执行适当的清理,释放其资源并执行任何其他必须执行的操作以执行整洁的终止。
    • 也许我理解错了,你问的是线程 A 是如何自行终止的?如果是这种情况,正如@caf 所说, pthread_exit() 很好(除非它更容易在主线程函数的末尾运行)。
    【解决方案2】:

    如果一个线程想要结束,它可以调用pthread_exit() 或者从初始线程函数返回。这些是等价的。

    我看不出线程不能在自身上调用pthread_cancel() 的任何原因,但这非常不寻常。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-30
      • 2011-08-04
      相关资源
      最近更新 更多