signal + multi-thread,真是个烦人的问题。下面的例子,两次给进程发送 SIGUSR1,会发现两次是由不同的 thread 接收到 signal。恩,会带来啥问题呢,下篇文字慢慢道来。
--------------------------------------------------
#include <pthread.h>
#include <signal.h>
#include <unistd.h>
int g_iExit = 0;
pthread_t pid, pid2;
void sig_usr1()
{
pid2 = pthread_self();
g_iExit = 1;
}
void* mythr(void *_)
{
while (1)
{
if ( g_iExit )
break;
}
}
int main()
{
pthread_t pid;
struct sigaction sa;
sa.sa_handler = sig_usr1;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
sigaction(SIGUSR1, &sa, NULL);
pthread_create(&pid, NULL, mythr, NULL);
printf("pid = %d\n", pid);
pthread_join(pid, NULL);
printf("pid2 = %d\n", pid);
sleep(100);
printf("main2 = %d\n", pid2);
return 0;
}
--------------------------------------------------
$ ./a.out
main1 = 134557696
pid = 134558720
pid2 = 134558720
main2 = 134557696
--------------------------------------------------
评论