簡體   English   中英

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

[英]Linux : pthread_cond_signal() is not working inside a Signal Handler()

Summary
-----------
1. In main() am going for pthread_cond_wait().
2. In signal handler() am waking main() using pthread_cond_signal().
3. But main() is not coming out from pthread_cond_wait().

怎么了 幫幫我。

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

在信號處理程序中,僅允許非常有限的系統調用數。

見男人7信號

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

也許您可以使用sigprocmask()來確保給定的信號不會到達代碼中的特定點,然后無法在該點執行信號處理程序。
例如:
*以下代碼基於James Sullivan的文章

鎖定/解鎖(也許)即將到達信號的功能:

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的這篇精彩文章 ,它可以更好地說明問題:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM