c - 函数内的 pthread_exit()

标签 c multithreading memory-management multiprocessing

我有一个多线程程序,线程工作可能需要相对较长的时间。

如果我想停止程序的执行,我有一个原子开关,我将它从 0 更改为 1,这会向线程发出它应该退出的信号。这目前在 while 循环中进行检查。

然而,while 循环的迭代可能需要相当长的时间。现在我想基本上在 while 循环中定义一些“优雅”的退出点。

基本上我会像这样定义一个简短的宏,其中 ks 是开关:

#define GRACE_EXIT(ks) \
    if (__atomic_load_n(ks, __ATOMIC_SEQ_CST) == 1) \
        pthread_exit(NULL);

现在我想知道是否允许从我从线程内调用的函数中调用它。

基本上在 while 循环中我调用了各种函数。我遇到的基本问题是,是否允许从不是线程入口点的函数内部调用 pthread_exit()。我关心的第二个问题是清理不在调用函数范围内的自动变量。

假设我是 4 个函数“深度”并调用此宏。即使自动变量不在范围内,是否也清除了所有自动变量?

最佳答案

您可以安全地调用pthread_exit()从线程中的任何地方,只要线程随后被连接或分离。但是,您分配或拥有的任何句柄和内存都不会被释放。

pthread_exit() 函数应终止调用线程,并使值 value_ptr 可用于与终止线程的任何成功连接。任何已被推送但尚未弹出的取消清理处理程序应按照它们被推送然后执行的相反顺序弹出。在执行完所有取消清理处理程序后,如果线程有任何线程特定的数据,则应以未指定的顺序调用适当的析构函数。线程终止不会释放任何应用程序可见的进程资源,包括但不限于互斥锁和文件描述符,也不执行任何进程级清理操作,包括但不限于调用任何可能存在的 atexit() 例程.

唯一的异常(exception)是:

如果从作为对 pthread_exit() 的隐式或显式调用的结果调用的取消清理处理程序或析构函数调用,则 pthread_exit() 的行为是未定义的。

关于c - 函数内的 pthread_exit(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26403874/

相关文章:

c - 包含 C 代码和汇编代码的 C 项目

c - malloc() 调用函数 - 段错误 : 11

java - 关于Thread的逻辑问题

c++ - 关于对内存泄漏的第 3 方 DLL 进行沙盒处理

java - jBoss 4.0.2 多次部署相同的 WAR 导致 jBoss 由于 PermGem/Out-of-Memory 错误而崩溃

python - 在 Windows 10 任务管理器的内存使用 View 中绘制正弦曲线?

c - 通过 TCP 发送的文件创建类型为 : application/octet-stream

c - 如何禁用字符代码 178 (0xB2) (²) 、179 (0xB3) (³) 和 185 (0xB9) (¹) 作为数字?

python - celery :如何限制队列中的任务数量并在满时停止喂食?

java - 使用 AsyncTask 显示圆形进度条