C++ Can';t使用信号唤醒POSIX线程

C++ 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

我正在为一个Linux目标编写一个多线程程序,其中一个线程只应在一个SIGIO信号从UART到达时运行。我已经测试了代码,没有使用线程,只有一个信号处理程序,它可以正常工作,但当我把它设为线程时,就会出现问题

main创建两个线程:GNSSThread和TestThread。 TestThread只是一段时间(1),每秒打印一个句子

我尝试过使用其他信号,我可以通过^C键盘输入成功地使代码从sigwaitinfo()继续。我想这可能是UART文件描述符的配置方式

希望有人能帮忙

代码如下

main.c

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;
}