我正在將多線程應用程序從HP-UX遷移到Solaris,到目前爲止,除了一件事外,一切都可以!應用程序有一個處理信號的線程,當它們中的一些被接收時,它會運行一些清理(記錄,殺死子進程等)。POSIX線程在HP-UX和Solaris 10之間的行爲不同
我已經減少了代碼一樣,因爲它有可能使一個莫名其妙簡單的例子顯示了問題:使用的編譯命令行
#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);
}
: 的Solaris:
CC -m64 -g temp.cpp -D_POSIX_PTHREAD_SEMANTICS -lpthread
HP- UX:
/opt/aCC/bin/aCC +p +DA2.0W -AA -g -z -lpthread -mt -I/usr/include temp.cpp
運行這兩個應用程序的行爲(按下摹CTRL + C,而在10秒循環):
HP-UX:
./a.out
SigWait...
Waiting... 1
Waiting... 2
Signal!! : 2 <---- CTRL + C
OUT
Waiting... 3
Waiting... 4 <---- CTRL + C again to terminate
的Solaris:
./a.out
SigWait...
Waiting... 1
Waiting... 2 <---- CTRL + C
^C
任何幫助將更加然後受歡迎的,因爲我已經撕裂我的頭髮(沒有太多):)!
謝謝!
謝謝!這確實解決了我的問題,即使在整個應用程序中。 我只是不明白爲什麼這可以在HP-UX上運行......也許在該線程實現中,所有線程都會收到信號? – JoaoSantos 2010-10-20 13:58:13
「也許在該線程實現所有線程接收信號?」應用程序收到信號 - 但它可以在任何* random *線程中處理。 HP-UX可能已經注意到,您的應用程序中的一個線程使用sigwait(),而Solaris尚未引起麻煩。信號與線程最好被描述爲一個灰色區域,你不想實驗。即使POSIX也不能完整地描述這些行爲,因爲細節差別很大,因爲一個操作系統對另一個操作系統有很大不同 – Dummy00001 2010-10-20 14:14:57
我給這個答案-1。這個答案是錯誤的,因爲你不能將信號從傳統的信號處理程序序列化到任何其他線程或數據結構。你將不得不在信號處理程序中使用一些鎖定,這是不可能的。在信號處理程序中你可以做的很少,使用鎖定原語不是其中之一。 – wilx 2010-10-20 16:09:58