在将此函数指定为工作函数时,我有一个取消pthread的简单测试:
static void * thread_start(void *arg)
{
printf("New thread started\n");
pthread_cleanup_push(cleanup_handler, NULL);
pthread_cancel(pthread_self());
pthread_testcancel(); /* A cancellation point */
return NULL;
}
cleanup_handler:
static void cleanup_handler(void *arg)
{
printf("Called clean-up handler\n");
}
但是我得到了一些无关语法错误的编译错误(在其他地方缺少'}')。另一方面,如果我像这样添加pthread_cleanup_pop(1):
static void * thread_start(void *arg)
{
printf("New thread started\n");
pthread_cleanup_push(cleanup_handler, NULL);
pthread_cancel(pthread_self());
pthread_testcancel(); /* A cancellation point */
pthread_cleanup_pop(1); //added this
return NULL;
}
它按预期编译并运行(pthread_cleanup_pop(1)未运行)。执行cleanup_handler并且线程返回PTHREAD_CANCLED。
最后使用pthread_cleanup_pop(1)是完全无关紧要的,因为所有清理处理程序应始终在线程即将终止时运行。我甚至不关心他们是否在没有取消的情况下运行。
有什么问题?
答案 0 :(得分:1)
查看the man
POSIX.1允许pthread_cleanup_push()和pthread_cleanup_pop() 实现为扩展为包含“{”和“}”的文本的宏, 分别。 出于这个原因,调用者必须确保调用 这些功能在同一功能中配对,同时也是如此 词汇嵌套级别。(换句话说,清理处理程序是 仅在执行指定部分期间建立 代码。)
强调我的