gpt4 book ai didi

linux - 更改另一个线程的 pthread 取消类型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:57 26 4
gpt4 key购买 nike

我想要完成的是主线程首先在工作线程上尝试正常的延迟取消(执行对我来说是黑盒子的代码),然后如果线程在超时后仍在运行(pthread_timedjoin_np()), 我想做一个异步取消。我遇到的问题是 pthread_setcanceltype() 仅适用于调用线程。是否有一些解决方法或技巧可以让我这样做?我想避免使用信号,因为至少在 Linux 下异步取消似乎仍会执行线程对象的 C++ 析构函数,这对我来说很重要。

最佳答案

在某些情况下,pthread_setcanceltype() 必须执行取消操作(请参阅下面的源代码)。所以,这就是为什么没有 pthread_setcanceltype_for_thread() 的原因。实际的取消类型是 pthread 结构中的字段,必须以原子方式更改。

ftp://sources.redhat.com/pub/glibc/snapshots/glibc-latest.tar.bz2/glibc-20090518/nptl/pthread_setcanceltype.c

__pthread_setcanceltype (type, oldtype)
int type;
int *oldtype;
{
volatile struct pthread *self;

self = THREAD_SELF;

int oldval = THREAD_GETMEM (self, cancelhandling);
while (1)
{
int newval = (type == PTHREAD_CANCEL_ASYNCHRONOUS
? oldval | CANCELTYPE_BITMASK
: oldval & ~CANCELTYPE_BITMASK);

/* Store the old value. */
if (oldtype != NULL)
*oldtype = ((oldval & CANCELTYPE_BITMASK)
? PTHREAD_CANCEL_ASYNCHRONOUS : PTHREAD_CANCEL_DEFERRED);

/* Update the cancel handling word. This has to be done
atomically since other bits could be modified as well. */
int curval = THREAD_ATOMIC_CMPXCHG_VAL (self, cancelhandling, newval,
oldval);
if (__builtin_expect (curval == oldval, 1))
{
if (CANCEL_ENABLED_AND_CANCELED_AND_ASYNCHRONOUS (newval))
{
THREAD_SETMEM (self, result, PTHREAD_CANCELED);
__do_cancel (); // HERE THE CANCELLING
}

break;
}

/* Prepare for the next round. */
oldval = curval;
}

return 0;
}
strong_alias (__pthread_setcanceltype, pthread_setcanceltype)

如果你有很大的需要在外部更改取消类型,你可以 hack 库并直接设置字段。

PS:用于 NPTL(当前在 Linux 上的 glibc 中实现 pthreads)查看如何从 int pthread_t 获取 struct pthread 的最简单方法是... pthread_join:

 pthread_join (pthread_t threadid, thread_return) 
{
struct pthread *pd = (struct pthread *) threadid;

关于linux - 更改另一个线程的 pthread 取消类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6590854/

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