C++ Can';t使用信号唤醒POSIX线程
我正在为一个Linux目标编写一个多线程程序,其中一个线程只应在一个SIGIO信号从UART到达时运行。我已经测试了代码,没有使用线程,只有一个信号处理程序,它可以正常工作,但当我把它设为线程时,就会出现问题 main创建两个线程:GNSSThread和TestThread。 TestThread只是一段时间(1),每秒打印一个句子 我尝试过使用其他信号,我可以通过^C键盘输入成功地使代码从sigwaitinfo()继续。我想这可能是UART文件描述符的配置方式 希望有人能帮忙 代码如下 main.cC++ Can';t使用信号唤醒POSIX线程,c++,linux,multithreading,signals,posix,C++,Linux,Multithreading,Signals,Posix,我正在为一个Linux目标编写一个多线程程序,其中一个线程只应在一个SIGIO信号从UART到达时运行。我已经测试了代码,没有使用线程,只有一个信号处理程序,它可以正常工作,但当我把它设为线程时,就会出现问题 main创建两个线程:GNSSThread和TestThread。 TestThread只是一段时间(1),每秒打印一个句子 我尝试过使用其他信号,我可以通过^C键盘输入成功地使代码从sigwaitinfo()继续。我想这可能是UART文件描述符的配置方式 希望有人能帮忙 代码如下 mai
int main(int argc, char **argv) {
cout << endl << "Process "<< argv[0] << " started with PID: " << getpid() << endl << endl;
InitConfig();
InitThreads();
return 0;
}
int main(int argc,char**argv){
cout线程有单独的信号掩码-因此您必须让您的GNSSThreadFn也注册信号掩码。请注意,只有一个线程将获得信号;如果您有多个线程使用该掩码侦听,则无法保证这一点。如果您总共阻止而不是取消阻止您感兴趣的信号,会发生什么线程?(例如,请参阅中的注释。)
sigset_t SigSet;
void InitThreads() {
pthread_t GNSSThreadID, TestThreadID;
//Configuring serial port to send SIGIO signal when I/O data ready to this process
fcntl(Config.GNSSDataLinkLayer->GetFD(), F_SETSIG, SIGIO);
fcntl(Config.GNSSDataLinkLayer->GetFD(), F_SETFL, O_ASYNC);
fcntl(Config.GNSSDataLinkLayer->GetFD(), F_SETOWN, getpid());
//Config thread to receive SIGIO
sigemptyset(&SigSet);
sigaddset(&SigSet, SIGIO);
sigprocmask(SIG_UNBLOCK, &SigSet, NULL);
pthread_create(&GNSSThreadID, NULL, GNSSThreadFn, NULL);
pthread_create(&TestThreadID, NULL, TestThreadFn, NULL);
pthread_join(TestThreadID, NULL);
}
void *GNSSThreadFn(void *param) {
cout << "Configuring GNSS Thread" << endl;
siginfo_t SigInfo;
mutex mtx;
cout << "Entering GNSS Thread while loop" << endl;
while(1){
//Thread suspended until signal arrives
cout << "Before sigwait" << endl;
sigwaitinfo(&WaitSet, &SigInfo);
cout << "After sigwait" << endl;
//checking for correct file descriptor and if signal caused by send or receive
if(SigInfo.si_fd == Config.GNSSDataLinkLayer->GetFD() && SigInfo.si_code == POLL_IN){
cout << "GNSSThreadMaster::ThreadLoop: Serial port read" << endl;
//Locking mutex while reading talker
mtx.lock();
Config.NMEATransportLayer->ReadTalker();
mtx.unlock();
}else if(SigInfo.si_fd == Config.GNSSDataLinkLayer->GetFD() && SigInfo.si_code == POLL_OUT){
tcdrain(Config.GNSSDataLinkLayer->GetFD());
//Magic sleep to make it work
usleep(20000);
}else
cout << "ThreadLoop: Signal error" << endl;
}
return NULL;
}