2016-04-17 5 views
2

私はtimer_create関数を使ってタイマーを作成しました。このタイマーは満了時にスレッドにシグナルを送ります。現時点では、特定のスレッドにタイマー信号を配信する実装が可能です。私が今直面している問題は、別の別のスレッド(基本的に第1のタイマー信号をスレッドAに、第2のタイマー信号をスレッドBに送る)に他のタイマーがある場合です。これは私がこれまでmutilpleタイマーでスレッドを別々の信号にする

static void * 
sig_threadproc(void *thrarg) 
{ 
    sigset_t sigset; 
    sigemptyset(&sigset); 
    sigaddset(&sigset, SIGALRM); 

/* endless loop to wait for and handle a signal repeatedly */ 
for (;;) { 
    int sig; 
    int error; 

    error = sigwait(&sigset, &sig); 
    if (error == 0) { 
     assert(sig == SIGALRM); 
     printf("got SIGALRM\n"); 
    } else { 
     perror("sigwait"); 
    } 
} 
return NULL; 
} 

static void 
sig_alrm_handler(int signo) 
{ 
    /** 
    * dummy signal handler, 
    * the signal is actually handled in sig_threadproc() 
    **/ 
} 


int 
main(int argc, char *argv[]) 
{ 
    sigset_t sigset; 
    struct sigaction sa; 
    pthread_t sig_thread; 
    struct itimerspec tspec; 
    timer_t timer_id; 

/* mask SIGALRM in all threads by default */ 
sigemptyset(&sigset); 
sigaddset(&sigset, SIGALRM);   
sigprocmask(SIG_BLOCK, &sigset, NULL); 

/* we need a signal handler. 
* The default is to call abort() and 
* setting SIG_IGN might cause the signal 
* to not be delivered at all. 
**/ 
memset(&sa, 0, sizeof(sa)); 
sa.sa_handler = sig_alrm_handler; 
sigaction(SIGALRM, &sa, NULL); 

/* create SIGALRM looper thread */ 
pthread_create(&sig_thread, NULL, sig_threadproc, NULL); 

/* setup timer */ 
tspec.it_interval.tv_sec = 1; 
tspec.it_interval.tv_nsec = 0; 
tspec.it_value.tv_sec = 1; 
tspec.it_value.tv_nsec = 0; 

timer_create(CLOCK_REALTIME, NULL, &timer_id); 
timer_settime(timer_id, 0, &tspec, NULL); 

/** 
* this might return early if usleep() is interrupted (by a signal) 
* It should not happen, since SIGALRM is blocked on the 
* main thread 
**/ 
usleep(10000000); 

return 0; 
    } 

答えて

0

SIGRTMINを使用する代わりに、リアルタイムタイマーのためSIGALRMを使用しないでくださいを書かれているものです。だから、最初の1つのためにsigev_signoメンバーのsevpの引数をSIGRTMIN + 0に設定し、第2のタイマーをsegev_signoに設定してSIGRTMIN + 1に設定します。つまり、第1のタイマーが起動すると、プロセスはSIGRTMIN信号を受信し、2回目の起動時にはSIGRTMIN + 1を受信します。

その後、あなたのスレッドBにマスク信号SIGRTMIN、あなたのプログラムの2つのスレッドでpthread_sigmaskを呼び出し、その結果、あなたのスレッドA.

SIGRTMIN + 1を隠し、あなたのスレッドAは、場合にのみ、第一タイマーが起動通知されますスレッドBは2番目のタイマーから通知を受け取ります。

+0

ありがとうございました。それは本当に私を助けてくれました。 – Harry

関連する問題