我正在使用Boost,但我的一般问题是: 假设我有这种情况:
// thread create
pthread_create(&thread_ptr, NULL, runner, NULL);
// thread join/killed
pthread_join(thread_ptr, NULL);
在不修改
runner
函数的情况下,我是否可以在线程加入之前或杀死线程之前运行函数/打印详细信息?
我尝试过修改跑步者功能。为了从线程获取特定信息,我只需将它们写入文件并获取线程特定数据。
这可能吗?如果是的话,怎么办?
在不修改 runner 函数的情况下,我是否可以在线程加入之前或被杀死之前运行函数/打印详细信息?
我认为您的意思是消息将由线程终止触发。您可以通过包装
runner
函数来解决此问题:
void diagnose(void *message) {
fputs((char *) message, stderr);
}
void *wrapper(void *arg) {
pthread_cleanup_push(diagnose, "Thread canceled\n");
void *result = runner(arg);
pthread_cleanup_pop(0);
diagnose("Thread terminating normally\n");
return result;
}
然后使用
wrapper
而不是 runner
作为线程函数。请注意,如果线程被信号终止,则该特定包装器不会发出消息(除非线程取消可能使用信号),但您可以为此目的注册一个信号处理程序。
然而,Pthreads 不提供将任何类型的消息传递或其他事件处理与外部线程关联起来的方法。它必须由线程函数控制。