c++ - HP-UX 和 Solaris 10 之间的 POSIX 线程行为不同

标签 c++ multithreading solaris posix

我正在将一个多线程应用程序从 HP-UX 迁移到 Solaris,到目前为止,除了一件事外一切正常!该应用程序有一个处理信号的线程,当接收到其中一些信号时,它会运行一些清理(日志记录、终止子进程等)。

我尽可能地减少了代码,以制作一个简单的示例来说明问题:

#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <synch.h>
#include <iostream>
#include <unistd.h>

using namespace std;

pthread_t       m_signalHandlerThread;
sigset_t        m_signalSet;

void    signalHandler()
{
    while ( true )
    {
        cout << "SigWait..." << endl;
        sigwait( &m_signalSet, &sig );
        cout << "Signal!! : " << sig << endl;

        break;
    }

    cout << "OUT" << endl;
}

void*   signalHandlerThreadFunction( void* arg )
{
   signalHandler();

   return (void*)0;
}


int main()  
{
    sigemptyset( &m_signalSet );
    sigaddset( &m_signalSet, SIGQUIT );             //kill -QUIT
    sigaddset( &m_signalSet, SIGTERM );             //kill
    sigaddset( &m_signalSet, SIGINT );              //ctrl-C
    sigaddset( &m_signalSet, SIGHUP );              //reload config

    if ( pthread_create( &m_signalHandlerThread, NULL, signalHandlerThreadFunction, NULL ) )
    {
        cout << "cannot create signal handler thread, system shut down.\n" << endl;
    }

    int iTimeout = 0;
    while (1) 
    {
        if (iTimeout >= 10)
           break;

        sleep(1);
        iTimeout++;
        cout << "Waiting... " << iTimeout << endl;
    }

    cout << "END" << endl;

    exit (0);
}

使用编译命令行: 索拉里斯:

CC -m64 -g temp.cpp -D_POSIX_PTHREAD_SEMANTICS -lpthread

惠普用户体验:

/opt/aCC/bin/aCC +p +DA2.0W -AA -g -z -lpthread -mt -I/usr/include  temp.cpp     

运行两个应用程序,行为(在 10 秒循环中按 CTRL+C):

惠普用户体验:

./a.out

SigWait...
Waiting... 1
Waiting... 2
Signal!! : 2   <---- CTRL + C
OUT
Waiting... 3
Waiting... 4   <---- CTRL + C again to terminate

索拉里:

./a.out

SigWait...
Waiting... 1
Waiting... 2   <---- CTRL + C
^C

任何帮助都将受到欢迎,因为我的头发已经撕裂了(剩下的不多了):)!

谢谢!

最佳答案

未指定您的 2 个线程中的哪一个将处理 SIGINT。如果您只需要一个线程来处理信号,则需要在您拥有的所有其他线程中阻止该信号。

关于c++ - HP-UX 和 Solaris 10 之间的 POSIX 线程行为不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3977188/

相关文章:

ios - 如何填充工作线程的命令缓冲区(iOS线程)

c# - 如何使用 ConcurrentQueue<T> 进行线程处理

Shell 脚本输出到控制台和登录在同一行?

linux - Solaris 与 Linux 中的系统调用开销

c++ - 在 C++ 中检测并清除从 dll 导入的错误对象

c++ - 双CPU内存分配性能

c++ - 将 Perl 正则表达式转换为等效的 ECMAScript 正则表达式

c++ - 从终端打开 Clion

python - 在 python 中稍后杀死线程

java - Apache Ant 在 Solaris 11 上找不到 tools.jar