gpt4 book ai didi

c++ - 在 PThreads 或 Windows 中线程退出时调用函数

转载 作者:IT王子 更新时间:2023-10-29 01:09:01 26 4
gpt4 key购买 nike

我正在为 Linux(带有 PThreads)和 Windows(带有内置 WinThreads)创建一个 C++ 库,它可以附加到任何程序,并且需要在线程退出时调用一个函数,类似于atexit 适用于进程。

我知道 pthread_cleanup_push 和 pthread_cleanup_pop 用于 pthreads,但这些对我不起作用,因为它们是添加另一个词法范围的宏,而我想在第一次调用我的库时声明这个函数,然后允许程序自己运行自己的代码,但它需要。我在 Windows 中没有发现任何类似的东西。

请注意,这并不意味着我希望在线程停止时提醒外部线程,甚至我可以更改线程退出的方式,因为这是由程序本身控制的,我的库只是附上,一起兜风。

所以问题是:在这种情况下,当我无法控制线程关闭时,在 Windows 或 Linux 中,让我拥有一个我编写的函数调用的最佳方法是什么线程是创建还是销毁?

例如在主程序中:

void* threadFunc(void* arg)
{
printf("Hello world!\n");
return NULL;
}

int main(int argc, char** argv)
{
int numThreads = 1;
pid_t* pids = NULL;
pids = (pid_t*) calloc(sizeof(pid_t), numThreads);

pthread_create(&ntid, NULL, threadFunc, &nVal);
pthreads[0] = ntid;

pthread_join(pthreads[0], NULL);
return 0;
}

在图书馆:

void callMeOnExit()
{
printf("Exiting Thread!\n");
}

我希望在线程到达 return NULL 时调用 callMeOnExit;在这种情况下,以及当主线程到达 return 0; 时。包装 pthread_exit 将适用于其他情况,并且可能是一种解决方案,但如果可能的话,我想要一个更好的解决方案。

如果有人对我如何做到这一点有任何想法,那就太好了!

最佳答案

因此,经过几次代码审查后,我们能够找到一种在 Linux 中执行此操作的更优雅的方法,它与 Windows 使用 Fibers 所做的(正如 Neeraj 指出的那样)以及我在开始研究这个问题。

关键是 pthread_key_create接受作为第二个参数的指向析构函数的指针,当任何初始化此 TLS 数据的线程死亡时调用析构函数。我已经在每个线程的其他地方使用了 TLS,但是一个简单的存储到 TLS 中也会让你获得这个功能,以确保它被调用。

关于c++ - 在 PThreads 或 Windows 中线程退出时调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10390738/

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