C 使用POSIX定时器后程序未退出

C 使用POSIX定时器后程序未退出,c,timer,pthreads,posix,glibc,C,Timer,Pthreads,Posix,Glibc,考虑以下计划: #define _POSIX_C_SOURCE 200809L #include <time.h> #include <pthread.h> #include <signal.h> void timerfunc(union sigval val) { } int main() { struct sigevent sev = { .sigev_notify = SIGEV_THREAD, .si

考虑以下计划:

#define _POSIX_C_SOURCE 200809L
#include <time.h>
#include <pthread.h>
#include <signal.h>

void timerfunc(union sigval val) { }

int main()
{
        struct sigevent sev = { .sigev_notify = SIGEV_THREAD,
                .sigev_notify_function = timerfunc };
        timer_t t;
        timer_create(CLOCK_REALTIME, &sev, &t);
        timer_delete(t);
        pthread_exit(0);
}
#定义POSIX_C_SOURCE200809L
#包括
#包括
#包括
void timerfunc(union sigval){}
int main()
{
struct sigevent sev={.sigev_notify=sigev_线程,
.sigev_notify_function=timerfunc};
定时器;
创建计时器(时钟、实时、服务和时间);
定时器_删除(t);
pthread_退出(0);
}
与glibc链接,它不仅无法终止,而且除了通过
kill-9
/
SIGKILL
之外,它是不可修改的。标准是否允许这种行为?除了总是显式退出进程(而不是仅仅退出所有线程)之外,还有什么好的解决方法吗?

是的

…无法确定 已创建线程的生存期

这意味着任何生命周期都是允许的


SIGEV_线程
简直就是一种糟糕的mojo,应该避免使用。

pthread_exit与主进程线程一起工作吗?我一直想知道pthread函数是否可以在不是pthread_create创建的线程上工作。

这太可惜了,因为它是一个吸引人的接口,可以从库代码中使用,并且不会影响调用程序的信号处理程序或其他全局状态,并且回调并不局限于异步信号安全函数。我想,可以通过使用
SIGEV_signal
计时器在每次过期时调用
sem_post
来获得线程回调语义(调用异步信号不安全函数的能力),还有一个线程,它在
sem\u trywait
上循环,然后
sem\u wait
来计算“溢出”的数量,并等待下一个计时器到期…不管它值多少,我进行了实验,发现
sem\u post
方法工作得非常好。@R:
SIGEV\u THREAD
的其他一些问题是没有指定新线程继承哪些属性(在
pthread\u attr\u t
未涵盖的属性中),如果无法创建新线程,则无法报告错误。您可以预先生成线程,让它
nanosleep()
,而不使用计时器。
nanosleep
不会很好地工作,但我认为
clock\u nanosleep
(使用
TIMER\u ABSTIME
)在间隔计时方面非常有效。是的,它们通常在主线程上工作。我认为可能没有明确说明主线程是可连接的还是分离的,但在其他方面一切都按预期工作——取消、信号传递、线程退出等等。您是说它们被记录下来,就像主进程线程是用pthread_create创建的一样工作,还是说您已经注意到,根据经验,它们似乎工作得很好?另外,您是否尝试过在实际使用pthread_create创建的线程中退出timer_create…timer_delete…pthread_?很抱歉,这没有用。这种行为的原因很清楚-glibc为计时器创建了一个管理线程,它会阻止所有信号并永远休眠。如果取消该线程呢?如果您在很短的时间间隔内创建了一个测试计时器…比如1ns,那么您就可以知道glibc线程在使用什么。你可以改变它的信号掩码,不管它值多少钱。如果在计时器函数中调用pthread_exit,会发生什么情况?