sigwait() 在多线程程序中不起作用
sigwait() does not work in multithreaded program
我正在尝试编写一个多线程程序,其中一个线程(下面的变量线程(负责可能设置为此过程的任何异步信号。
我面对的是使用 sigwait(( 但不对已发送到处理的任何信号做出反应的线程。(如下面的SIGUSR1(。
static void * signal_thread(void *arg = nullptr)
{
int sig = -1;
sigset_t sigset;
sigfillset(&sigset);
pthread_sigmask(SIG_BLOCK, &sigset, NULL);
while(1)
{
int s = sigwait(&sigset, &sig);
if(s == 0)
printf("SIG %d recieved!...n", sig);
usleep(20);
}
}
int main()
{
sigset_t signalset;
pthread_t thread;
pthread_create(&thread, NULL, &signal_thread, nullptr);
sigfillset(&signalset);
pthread_sigmask(SIG_BLOCK, &signalset, NULL);
while(1)
{
raise(SIGUSR1);
usleep(20);
}
}
该问题涉及两个问题:
首先,在主线程中调用 raise 只发送给主线程的信号,而不是整个过程。
其次,在signal_thread中应该使用 std::cout 而不是 printf。
raise(sig)
相当于调用pthread_kill(pthread_self(), sig)
。
由于main
线程raise()
信号,因此将为该线程生成SIGUSR1,而不是为任何其他线程生成。 因此,您的signal_thread
将无法为 USR1sigwait()
,对于生成它的线程,USR1 将保持挂起状态。
相关文章:
- 为什么使用数组元素查找最大数字的程序不起作用?
- 用于拆分空格字符串的程序不起作用
- 反转一个数字程序不起作用,为什么?
- C++从句子中删除给定字符的程序不起作用
- 为什么当我选择>250000个采样点时,程序不起作用?
- 我的C 程序不起作用
- C++加密程序不起作用
- 发送到64位应用程序不起作用
- 猪拉丁程序不起作用
- 结构程序不起作用
- 为什么程序不起作用
- 找不到WCHAR.H文件-Xcode 9.0中断QT创建者 - 旧修复程序不起作用
- C++为什么我的程序不起作用..:S.
- C++帮助!程序不起作用
- 如果我将类声明为常量,程序不起作用...而不是康特斯普?
- 为什么我的C++程序不起作用
- c++11-实现Promise的示例程序不起作用
- 为什么我的程序不起作用以及如何阻止它快速关闭
- 我的火狐扩展程序不起作用。使用C++XPCOM组件的Firefox扩展(XPI文件)的结构是什么?
- std::在C++中设置删除程序不起作用