Inject runtime exception to pthread sometime fails. How to fix that?

Posted by lionbest on Stack Overflow See other posts from Stack Overflow or by lionbest
Published on 2010-04-23T04:17:32Z Indexed on 2010/04/23 4:23 UTC
Read the original article Hit count: 281

Filed under:
|
|

I try to inject the exception to thread using signals, but some times the exception is not get caught. For example the following code:

void _sigthrow(int sig)
{
    throw runtime_error(strsignal(sig));
}
struct sigaction sigthrow = {{&_sigthrow}};

void* thread1(void*)
{
    sigaction(SIGINT,&sigthrow,NULL);
    try
    {
        while(1) usleep(1);
    }
    catch(exception &e)
    {
        cerr << "Thread1 catched " << e.what() << endl;
    }
};

void* thread2(void*)
{
    sigaction(SIGINT,&sigthrow,NULL);
    try
    {
        while(1);
    }
    catch(exception &e)
    {
        cerr << "Thread2 catched " << e.what() << endl; //never goes here
    }
};

If I try to execute like:

int main()
{
    pthread_t p1,p2;

    pthread_create( &p1, NULL, &thread1, NULL );
    pthread_create( &p2, NULL, &thread2, NULL );

    sleep(1);

    pthread_kill( p1, SIGINT);
    pthread_kill( p2, SIGINT);

    sleep(1);

    return EXIT_SUCCESS;
}

I get the following output:

Thread1 catched Interrupt
terminate called after throwing an instance of 'std::runtime_error'
  what():  Interrupt
Aborted

How can I make second threat catch exception? Is there better idea about injecting exceptions?

© Stack Overflow or respective owner

Related posts about c++

Related posts about pthreads