Linux:pthread_cond_signal()在Signal Handler()中不起作用

时间:2015-06-17 11:39:33

标签: c++ c linux signals posix

#include <stdio.h>  
myclass *myObj = NULL;

这里有什么问题?帮助我。

int main()
{
    myObj = new myclass;    
    /* do something */
    myobj->gotoWait(); <=== Wait blocked for ever.
    /* do clean up here */
    return 0;
}

主要是我试图等待信号:

static void signalHandler(int sig, siginfo_t *siginfo, void *context)
{
    myObj->wakeFromWait();
}

信号处理程序向主线程发送信号:

myclass::gotoWait()
{
    pthread_mutex_lock(&mtx);
    pthread_cond_wait(&cnd, &mtx);
    pthread_mutex_unlock(&mtx);
} 
myclass::wakeFromWait()
{
    pthread_mutex_lock(&mtx);
    pthread_cond_signal(&cnd, &mtx);
    pthread_mutex_unlock(&mtx);
}

实现等待和发送信号的实际类。

这里有什么问题?

<body>

2 个答案:

答案 0 :(得分:4)

在信号处理程序中,只允许非常有限数量的系统调用。

参见man 7 signal

http://man7.org/linux/man-pages/man7/signal.7.html

我的建议是,为了安全起见,所谓的“自我管道技巧”。 http://man7.org/tlpi/code/online/diff/altio/self_pipe.c.html

你可以启动一个在自管道上运行select循环的线程并调用你的适当处理程序。

您的代码有什么问题?您正在信号处理程序

中锁定互斥锁

编辑:这里有一个信号指南 http://beej.us/guide/bgipc/output/html/multipage/signals.html

答案 1 :(得分:2)

也许您可以使用 sigprocmask()来确保给定的信号不会到达代码中的特定点,然后信号处理程序无法在该点执行。 /> 例如:
*以下代码基于此James Sullivan's article

锁定/解锁(可能)即将到达的信号的功能:

void signal_lock (sigset_t *save) {
    sigset_t set;

    sigfillset(&set); /* fill `set` with __all__ signals */
    sigprocmask(SIG_BLOCK, &set, save); /* no more signals :-)  */
}

void signal_unlock (sigset_t *save) {
    sigprocmask(SIG_SETMASK, save, NULL); /* enable again */
}

致电signal_lock() ...

sigset_t tmp;

signal_lock(&tmp); /* we locked all signals --
                    * no signal will arrives until signal_unlock() */
pthread_mutex_lock(<pthread_mutex_t*>);
/* do your stuff */
pthread_mutex_unlock(<pthread_mutex_t*>);
signal_unlock(&tmp); /* unlock signals --
                      * only signals allowed before signal_lock()
                      * may arrive */

我建议你仔细阅读James Sullivan撰写的这篇amazing article,它解释得更好: - )