我有一个多线程程序,线程工作可能需要相当长的时间。
如果我想停止程序的执行,我有一个原子开关,我从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个功能' deep'并调用此宏。是否清除了所有自动变量,即使它们不在范围内?
答案 0 :(得分:1)
只要线程随后被连接或分离,您就可以安全地从线程中的任何位置调用pthread_exit()。但是,您分配或拥有的任何句柄和内存都不会被释放。
pthread_exit()函数将终止调用线程,并使值value_ptr可用于与终止线程的任何成功连接。任何已被推送但尚未弹出的取消清理处理程序将按照按下它们然后执行的相反顺序弹出。在执行了所有取消清理处理程序之后,如果该线程具有任何特定于线程的数据,则应以未指定的顺序调用适当的析构函数。线程终止不释放任何应用程序可见的进程资源,包括但不限于互斥锁和文件描述符,也不执行任何进程级清理操作,包括但不限于调用可能存在的任何atexit()例程的
唯一的例外是:
如果从取消清理处理程序或析构函数调用pthread_exit()的行为是由于对pthread_exit()的隐式或显式调用而调用的。
答案 1 :(得分:0)
所以你有foo
用作线程的主要功能,然后在foo
内你调用bar
,里面有pthread_exit(NULL);
?应该工作正常。
这主要是针对其他人的:如果你在该线程中打开一个新线程退出第一个线程,那么它就不会起作用。