Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/156.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Linux:pthread_cond_signal()在信号处理程序()内不工作_C++_C_Linux_Signals_Posix - Fatal编程技术网

C++ Linux:pthread_cond_signal()在信号处理程序()内不工作

C++ Linux:pthread_cond_signal()在信号处理程序()内不工作,c++,c,linux,signals,posix,C++,C,Linux,Signals,Posix,这里怎么了?帮帮我 实现信号等待和发送的实际类 这里怎么了 static void signalHandler(int sig, siginfo_t *siginfo, void *context) { myObj->wakeFromWait(); } 在信号处理程序中,只允许非常有限的系统调用 见man 7信号 为了安全起见,我的建议是所谓的自我管道技巧。 您可以启动一个在self管道上运行select循环的线程,并调用您的appropiate处理程序 你的代码有什么问题?您

这里怎么了?帮帮我

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

这里怎么了

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

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

见man 7信号

为了安全起见,我的建议是所谓的自我管道技巧。

您可以启动一个在self管道上运行select循环的线程,并调用您的appropiate处理程序

你的代码有什么问题?您正在锁定信号处理程序中的互斥体

编辑:这里有一个信号指南

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

见man 7信号

为了安全起见,我的建议是所谓的自我管道技巧。

您可以启动一个在self管道上运行select循环的线程,并调用您的appropiate处理程序

你的代码有什么问题?您正在锁定信号处理程序中的互斥体

编辑:这里有一个信号指南

也许您可以使用sigprocmask来确保给定的信号不会到达代码中的特定点,然后信号处理程序就不能在该点执行。 例如: *下面的代码基于此

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

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);
}
呼叫信号锁定后

我建议您仔细阅读James Sullivan的这篇文章,它更好地解释了这些事情:-

也许您可以使用sigprocmask来确保给定的信号不会到达代码中的特定点,然后信号处理程序就不能在该点执行。 例如: *下面的代码基于此

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

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);
}
呼叫信号锁定后


我建议您仔细阅读James Sullivan的这篇文章,它可以更好地解释以下内容:-

感谢@schorsch_76提供有关自管道的有效信息和输入。感谢@schorsch_76提供有关自管道的有效信息和输入。这里有什么问题吗?① 你不给我们一个机会。② 您使用的是一个没有谓词的条件变量,这对于任何非平凡的应用程序都可能是不正确的,即使没有虚假的唤醒。③ 您等待一个条件变量而没有预期。④ 您错误地调用了pthread_cond_wait-这是如何编译的?⑤ 你在信号处理器里做不安全的事情,这里怎么了?① 你不给我们一个机会。② 您使用的是一个没有谓词的条件变量,这对于任何非平凡的应用程序都可能是不正确的,即使没有虚假的唤醒。③ 您等待一个条件变量而没有预期。④ 您错误地调用了pthread_cond_wait-这是如何编译的?⑤ 在信号处理器中执行不安全的操作。
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);
}
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 */
}
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 */