多线程程序与定时器和信号
Multi thread program with Timer and Signals
我是多线程编程的新手,所以这个问题可能看起来有点傻,下面是我的代码,我试图有2个线程:
struct sigaction S1,S2;
struct itimerval T1,T2;
void Function1(){
cout<<"Function1 "<<endl;
}
void Function2(){
cout<<"Function2 "<<endl;
}
void Thread_Function(){
int t=70000;
memset (&s2, 0, sizeof (s2));
s2.sa_handler = &Function2;
sigaction (SIGALRM, &s2, NULL);
sigemptyset(&s2.sa_mask);
s2.sa_flags = 0;
T2.it_value.tv_sec = 0;
T2.it_value.tv_usec =t;
T2.it_interval.tv_sec =0;
T2.it_interval.tv_usec =t;
setitimer (ITIMER_REAL, &T2, NULL);
}
int main(){
int t=50000;
memset (&s1, 0, sizeof (s1));
s1.sa_handler = &Function1;
sigaction (SIGALRM, &s1, NULL);
sigemptyset(&s1.sa_mask);
s1.sa_flags = 0;
T1.it_value.tv_sec = 0;
T1.it_value.tv_usec =t;
T1.it_interval.tv_sec =0;
T1.it_interval.tv_usec =t;
setitimer (ITIMER_REAL, &T1, NULL);
thread t1(Thread_Function);
}
问题是Function1
没有执行换句话说,我在输出中看不到Function1
来自setitimer
手册页
一个进程只有三种定时器中的一种。
您正在尝试使用两个相同类型的计时器,这是不可能的。
如果你想有多个计时器,需要另一个解决方案。
信号不能很好地处理线程。
它们也不是每个线程工作,而是每个进程工作。您正在做的是首先将SIGALRM信号处理程序设置为Function1
,然后启动一个线程,然后覆盖处理程序以调用Function2
。
即使你使用单线程信号处理程序,信号也会发送到整个进程。因此,一个随机线程将处理信号,而所有其他线程不会。
你可以用pthread_sigmask指定你想处理这个信号的线程。但是一般来说,混合信号和多线程并不能很好地工作。
这里你有一些类似的问题,可能会对这个问题有更多的启发。他们可能会谈论pthread
而不是std::thread
,但问题是一样的。
pthreads中的信号处理
POSIX线程和信号
相关文章:
- Ardunio UNO解决了多个重叠的定时器循环
- 我们能否在stm32f中使用硬件定时器控制两个独立的进程
- Arduino Nano:A4988 使用串行输入时通过定时器进行步进控制不稳定
- 没有信号处理程序的POSIX定时器的目的是什么?
- 在定时器回调函数中使用 Sleep() 会导致C++出现问题吗?
- 如何在Qt中修改QWebsocket定时器
- C++Windows中的高分辨率定时器库
- 如何用单个信号处理程序解决这个多linux定时器的问题
- C#/.NET定时器和Win32睡眠函数都是不精确的
- Udp 在 QT 定时器信号中写入数据报
- AVR CTC模式下的16位定时器
- Linux C++定时器与软实时支持
- 在Qt中实现精确定时器
- 在不中断串行的情况下禁用Arduino上的定时器0中断
- 跨平台C++高精度事件定时器实现
- 非阻塞定时器C++
- 如何使用QTextStream读取行一次一个,使用定时器
- c++定时器实现-将一个成员函数分配给信号回调函数指针
- 使用定时器和信号代替睡眠c/c++
- 多线程程序与定时器和信号