【问题标题】:C: Do I need to cancel a thread I'm done using?C: 我需要取消一个我用完的线程吗?
【发布时间】:2021-11-14 11:27:45
【问题描述】:

我正在用 C 语言创建一个线程,以便在运行时检查网页上的内容。我是想关闭这个线程,还是一旦它完成执行,它会自动被释放?

--> Imports
#include <stdbool.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>

--> Start thread 
pthread_t thread_id;

pthread_create(&thread_id, NULL, threadFunction, NULL);


---> Thread function

void *threadFunction(void *vargp) { 

    //Do something...
    
    return NULL;
}

【问题讨论】:

  • 您使用什么线程库或标准? (向我们展示一些代码会更有帮助。)
  • 你的线程库的文档是怎么说的?
  • 查找讨论可连接线程、分离线程和取消线程概念的线程教程。
  • @jarmod 完成,对此感到抱歉。对 C 来说是全新的,所以仍在搞清楚基础
  • 简而言之,创建分离线程并允许线程退出通常就足够了。如果知道线程何时退出很重要,您可以创建可连接线程,然后主线程等待它们退出连接。线程取消很少使用,但如果线程在取消点被阻塞或死锁,则可以使用。

标签: c pthreads


【解决方案1】:

pthread 的文档是这样说的:

线程是在执行 start_routine 时创建的,arg 作为其唯一参数。如果 start_routine 返回,效果应该就像使用 start_routine 的返回值作为退出状态对 pthread_exit() 进行了隐式调用。请注意,最初调用 main() 的线程与此不同。当它从 main() 返回时,效果应该是隐式调用 exit(),使用 main() 的返回值作为退出状态。

所以不需要显式终止线程。

【讨论】:

  • 仍有资源需要清理以用于可连接线程(使用pthread_join),否则您将留下一个“僵尸线程”
【解决方案2】:

您不需要考虑使用pthread_cancel,除非目标是提前结束正在运行的线程的执行。

在大多数情况下,您只是希望线程完成其工作。您通常使用pthread_join 加入线程来检测线程已完成。

如果您正在创建一个预计不会结束的线程,或者它何时结束并不重要,您可以创建一个分离的线程,或者在创建后使用pthread_detach 将其分离。然后,线程不可连接。

您的示例代码为线程属性传入NULL,这导致pthread_create 使用默认属性。您应该检查您的系统,但 Linux 默认会创建可连接线程。

对于大多数初学者项目,创建可连接线程可能是最简单的,并在生成所有线程后让主线程调用pthread_exit。这会在程序终止之前等待每个生成的线程完成执行。

否则,如果主线程在线程完成后需要执行摘要工作,它将在每个线程上等待pthread_join,直到所有线程都返回。最后一个线程返回后,主线程可以做自己需要做的事情,然后退出。

【讨论】:

    猜你喜欢
    • 2020-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多