带定时器和信号的多线程程序

时间:2016-10-18 13:46:48

标签: c++ multithreading signals ubuntu-14.04

我是多线程编程的新手,所以这个问题可能看起来有点傻,Follow是我的代码,我想尝试2个帖子:

import os
import csv
import pymysql
import pymysql.cursors
d=open('c:/Users/dasa17/Desktop/pylearn/Roster.csv', 'w')
c=csv.writer(d)
Connection = pymysql.connect(host='xxxxx', user='xxxxx', password='xxxx',
         db='xxxx',charset='utf8mb4',cursorclass=pymysql.cursors.DictCursor )
a=Connection.cursor()
a.execute("select statement")
data=a.fetchall()
for item in data:
    c.writerow(item)
a.close()
d.close()
Connection.close()

问题是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

2 个答案:

答案 0 :(得分:1)

来自the setitimer manual page

  

一个进程只有三种类型的定时器中的一种。

您正在尝试使用两个相同类型的计时器,但这是不可能的。

如果您想拥有多个计时器,则需要另一种解决方案。

答案 1 :(得分:0)

信号与线程不兼容。

它们也不适用于每个线程,但每个进程。你正在做的是首先将SIGALRM信号处理程序设置为Function1,然后启动一个线程,然后覆盖处理程序以调用Function2

即使您有每线程信号处理程序,信号也会发送到整个进程。所以一个随机线程将处理信号,所有其他线程不会。

您可以使用pthread_sigmask指定要处理信号的线程。但总的来说,混合信号和多线程根本不能很好地工作。

在这里你有一些类似的问题,可能会更多地阐明这一点。他们可能会谈论pthread而不是std::thread,但问题是相同的。

Signal handling in pthreads

POSIX threads and signals