gpt4 book ai didi

c++ - C++中多线程的timer_create

转载 作者:行者123 更新时间:2023-11-30 19:10:02 25 4
gpt4 key购买 nike

多个线程调用一个方法并使用timer_create和设置一个计时器定时器_设置时间。我试图在

中传递线程 id

sev.sigev_value.sival_ptr = &info;

但是,当调用处理程序时,它会带有不同的线程 ID(可能是主函数的 ID),并且不会调用我的取消方法。

        timer_t timerid;
struct sigevent sev;
struct itimerspec its;
long long freq_nanosecs;
sigset_t mask;
struct sigaction sa;

sa.sa_flags = SA_SIGINFO;
sa.sa_sigaction = &handler;
sigemptyset(&sa.sa_mask);
sigaction(SIGUSR1, &sa, NULL);

sev.sigev_notify = SIGEV_SIGNAL;
sev.sigev_signo = SIGUSR1;
sev.sigev_value.sival_ptr = &info;
timer_create(CLOCK_REALTIME, &sev, &timerid);
/* Start the timer */

its.it_value.tv_sec = 3;
its.it_value.tv_nsec = 0;
its.it_interval.tv_sec = its.it_value.tv_sec;
its.it_interval.tv_nsec = its.it_value.tv_nsec;

timer_settime(timerid, 0, &its, NULL);

现在处理程序是

        Info *inc;
inc = (Info *)si->si_value.sival_ptr;

std::thread::id thread_id = std::this_thread::get_id();

if(inc->thread_id != thread_id){
LOG << "This thread is not blocking";
} else {
printf("Caught signal %d from timer\n", sig);

cancel(...);
}

我的问题是,我无法根据来自调用线程的唯一值正确识别调用取消方法的正确方法。

任何建议

最佳答案

阻塞connectread/recv/recvmsg/recvfrom返回EINTR 当被信号中断并且该信号没有使用 SA_RESTART 时。这是alarm系统调用背后的主要意图,但是,它是在多线程之前发明的,因此它将信号发送到进程而不是特定线程。

要打破阻塞套接字 connect 调用,请设置一个计时器,使用 SIGEV_THREAD_ID 向特定线程发送信号。将信号处理程序发送到SIG_IGN 并确保 SA_RESTART 未用于该信号。

关于c++ - C++中多线程的timer_create,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42005241/

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