有一個定時器每隔1秒發出一次信號SIGALARM。睡覺 秒的信號處理程序已註冊。怎麼了?具體來說,我有以下代碼,其中進程運行多個線程。有趣的是,使用這個長信號處理程序,看起來其他線程被阻止執行......任何人都可以解釋爲什麼這是這種情況?帶有長信號處理器(SIGALARM)的定時器問題
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h> //rand
#include <sys/wait.h>
#include <time.h>
#include <sys/time.h>
#include <pthread.h>
#define NUM_THREADS 2
int init_timer(int real_time, int msec) {
struct itimerval timeslice;
timeslice.it_interval.tv_sec = msec/1000;
timeslice.it_interval.tv_usec = (msec % 1000) * 1000;
timeslice.it_value.tv_sec = msec/1000;
timeslice.it_value.tv_usec = (msec % 1000) * 1000;
setitimer(real_time ? ITIMER_REAL : ITIMER_VIRTUAL, ×lice, NULL);
return 0;
}
void install_handler(int signo, void(*handler)(int)) {
sigset_t set;
struct sigaction act;
/* Setup the handler */
act.sa_handler = handler;
act.sa_flags = SA_RESTART;
sigaction(signo, &act, 0);
/* Unblock the signal */
sigemptyset(&set);
sigaddset(&set, signo);
sigprocmask(SIG_UNBLOCK, &set, NULL);
return;
}
void timerTest(int signo)
{
printf("000\n");
sleep(1);
printf("111\n");
}
void * threadTest(void * threadId)
{
while(true)
{
printf("222\n");
}
}
int main(int argc, char *argv[]) {
int real_time = 1;
int tick_msec = 10;
init_timer(real_time, tick_msec);
install_handler(real_time ? SIGALRM : SIGVTALRM, &timerTest);
pthread_t threads[NUM_THREADS];
int rc;
long t;
for (t = 0; t < NUM_THREADS; t++) {
rc = pthread_create(&threads[t], NULL, threadTest, (void *) t);
if (rc) {
exit(-1);
}
}
void * status;
for (t = 0; t < NUM_THREADS; t++) {
rc = pthread_join(threads[t], &status);
if (rc) {
exit(-1);
}
}
pthread_exit(NULL);
}
打印:
222
222
222
222
...
222
000
111
000
111
...
不會有222發生第111後?爲什麼這樣?
在帖子中包含操作系統也可能相關。 – 2011-05-25 19:45:11