取消pthread似乎很奇怪

时间:2016-09-15 13:26:44

标签: c multithreading pthreads posix pthread-cleanup

在将此函数指定为工作函数时,我有一个取消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)是完全无关紧要的,因为所有清理处理程序应始终在线程即将终止时运行。我甚至不关心他们是否在没有取消的情况下运行。

有什么问题?

解决

1 个答案:

答案 0 :(得分:1)

查看the man

  

POSIX.1允许pthread_cleanup_push()和pthread_cleanup_pop()          实现为扩展为包含“{”和“}”的文本的宏,          分别。 出于这个原因,调用者必须确保调用          这些功能在同一功能中配对,同时也是如此          词汇嵌套级别。(换句话说,清理处理程序是          仅在执行指定部分期间建立          代码。)

强调我的