gpt4 book ai didi

c - pthread取消激活时间

转载 作者:行者123 更新时间:2023-11-30 15:58:26 25 4
gpt4 key购买 nike

我想在进程取消初始化完成之前取消线程,如下所示。

rc2 = pthread_attr_init(&attr);
ERR_IF( rc2 != 0 );

rc2 = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
ERR_IF( rc2 != 0 );

rc2 = pthread_create(&destroy_thread, &attr, destroy_expired_sessions, NULL);
ERR_IF( rc2 != 0 );
...
rc2 = pthread_cancel(destroy_thread);
ERR_IF( rc2 != 0 );

usleep(10); // without the sleep here, the real cancellation will be postponed.

rc2 = authSessionListDeInit();
ERR_IF( rc2 != 0 );

...

static void *destroy_expired_sessions(void *t)
{
int rc2 = 0;

(void)t;

pthread_cleanup_push(cleanup_handler, NULL);

rc2 = pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL);
if (rc2 != 0)
AUTH_DEBUG5("pthread_setcancelstate(): rc2 == %d\n", rc2);

rc2 = pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
if (rc2 != 0)
AUTH_DEBUG5("pthread_setcanceltype(): rc2 == %d\n", rc2);

... // real work of the thread is done here
}

问题是,虽然这里设置了 PTHREAD_CANCEL_ASYNCHRONOUS,但真正的线程取消总是发生在 authSessionListDeInit() 之后,除非我在中间强制使用 usleep()。

我的理解是取消应该在通过 pthread_cancel() 发送取消请求后立即发生,不是吗?

如果我的理解不正确,如何确保线程在调用 authSessionListDeInit() 之前被取消?

最佳答案

来自docs :

The cancellation processing in the target thread shall run asynchronously with respect to the calling thread returning from pthread_cancel().

因此 pthread_cancel 可以在取消发生之前返回,这意味着您的假设是错误的。

您可以考虑使用更流行且可以说更安全的方法(pthread_cancel 失败的风险),而不是使用 pthread_cancel,即使用取消标志和/或条件变量来在函数实际结束时发出信号。

关于c - pthread取消激活时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9754585/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com