【发布时间】:2012-05-10 13:39:32
【问题描述】:
我正在为 Linux(带有 PThreads)和 Windows(带有内置 WinThreads)创建一个 C++ 库,它可以附加到任何程序,并且需要在线程退出时调用一个函数,类似于如何atexit 适用于进程。
我知道 pthreads 的 pthread_cleanup_push 和 pthread_cleanup_pop,但它们对我不起作用,因为它们是添加另一个词法范围的宏,而我想在第一次调用我的库时声明这个函数,然后允许程序自己运行自己的代码,但它需要。我在 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;在这种情况下,以及当主线程到达时返回 0;。包装 pthread_exit 将适用于其他情况,并且可能是一种解决方案,但如果可能的话,我想要一个更好的解决方案。
如果有人对我如何能够做到这一点有任何想法,那就太好了!
【问题讨论】:
-
您正在创建一个 C++ 库?好吧,不要粗鲁,但如果你问的是这种性质的东西,而不是严格阅读相关规范,那么也许你应该只使用 boost 或 qt。已经有库可以满足您的需求。一个人的图书馆就像一个人的船员一样现实——如果你要提供你正在谈论的功能,那么大量的工作是不可能的。如果你为这个特定的工作写了一个包装类而不是一个库,这听起来很适用。
-
但是,为了获得答案,或者可能是为了了解您想要做什么:包装类可以隐藏复杂性并管理线程的创建和启动,并且与平台无关。我确信有某种方法可以让包装类在启动之前调用你想要的函数,并在它退出时再次/另一个函数。
-
发送到 DLL 的
Dllmain()函数的 WindowsDLL_THREAD_DETACH消息可能会有所帮助,但我认为也有很多可能的陷阱。 -
@Adam Miller:这不是特别有用,除非您将您的评论归结为“我建议您包装 boost 或 qt 线程来实现此功能”的内容
-
@Adam:我认为问题不在于包装线程 API 的库 - 我相信有问题的库不参与线程的创建(但这还不清楚 - 它如果是这样的话,可能应该说清楚)。
标签: c++ windows linux multithreading pthreads