[LC++]Question on pthreads
David Filion
david at filiontech.com
Fri Jul 16 07:17:01 UTC 2004
Jan Pfeifer wrote:
> I think the easiest way would be to read user input from a separate
> thread, and let the "main" thread only wait for the others. If your
> polling thread finishes, the "main" thread could kill/cancel the thread
> reading user input.
>
> I was also wondering if getchar() is interrupted by signals, returning
> "EINTR" ... If it is your exiting thread could signal the "main" thread.
> Use something like SIGUSR and create some kind of flag to check for
> that. If getchar() is not interrupted, try using read(2) directly.
>
> Let me code the idea:
> * Disclaimer: havent' tested the code, nor considered race conditions,
> such as the thread endind before the call to the function. *
>
> bool ops = false;
>
> void sigusr_handler( int i )
> { ops = true; }
>
> char our_read_char()
> {
> char c;
> int ret;
> while (true) {
> ret = read( 0, &c, 1 );
> if ( ret == 1 ) break;
> if ( ret == -1 && errno = EINTR && ops )
> {
> ops = false;
> throw thread_ended_exception();
> }
> if ( ret == -1 && errno != EINTR )
> throw io_error_exception();
> }
> return c;
> }
>
> best luck :)
>
> jan
>
>
> Krishna Monian wrote:
>
>> I still have a problem though. After creating the
>> thread in my main function, this is part of the code
>> that follows.
>>
>> while(getchar() != '\n') {}
>>
>> So basically I am waiting till the user hits the enter
>> key. As soon as the user does this, my program will
>> cleanup and quit. The thread that I spawn also does
>> some sort of polling operation.
>>
>> If I use pthread_join in main() then the program
>> doesn't terminate when the user hits return (obviously
>> it won't, since it has joined the other thread).
>>
>> How do I go about achieving this?
>>
>> Thanks
>> Krishna
>>
>>
>> --- Jack Lloyd <lloyd at acm.jhu.edu> wrote:
>>
>>
>>> Yes. If the function created by pthread_create
>>> returns a value, then when you
>>> call pthread_join, it will return this status to
>>> you. In this way you can
>>> easily exit the thread and return a status code
>>> signaling the rest of your
>>> program to abend. That's why your thread start
>>> routines must return a void*,
>>> that's the status code.
>>>
>>> If you want to return an integer or some such,
>>> remember to dynamically allocate
>>> it and return the pointer -- if you return
>>> &status_code, it will go away once
>>> the thread exits. Obvious, but sometimes it's easy
>>> to forget (especially with
>>> pthreads). And, of course, free it in your main
>>> thread after you pthread_join
>>> the other thread.
>>>
>>> Since this when to the C++ list and not the C list,
>>> I'll also remind you that
>>> you can't (safely) throw an exception in a thread
>>> and have it be caught outside
>>> that thread. It could be done, but nobody requires
>>> it, and I'm sure it would be
>>> very difficult to implement, so nobody does. Just in
>>> case you were thinking
>>> about doing that to signal errors. :)
>>>
>>> -Jack
>>>
>>> On Wed, Jul 14, 2004 at 02:11:06PM -0700, Krishna
>>> Monian wrote:
>>>
>>>
>>>> Hi, I have a pthread that is spawned from my main
>>>>
>>>
>>> function
>>>
>>>
>>>> and then the main function just waits until the
>>>>
>>>
>>> user
>>>
>>>
>>>> hits enter. Now I want the program to terminate if
>>>>
>>>
>>> a
>>>
>>>
>>>> something unexpected in the thread spawned. How
>>>> exactly do I go about doing this?
>>>>
>>>> Even better would be if the thread could return a
>>>> value to the main function. Is this possible?
>>>>
>>>> Thanks
>>>> Krishna
>>>>
>>>>
>>>>
>>>> __________________________________
>>>> Do you Yahoo!?
>>>> New and Improved Yahoo! Mail - Send 10MB messages!
>>>> http://promotions.yahoo.com/new_mail
>>>> _______________________________________________
>>>> This is the Linux C++ Programming List
>>>> :
>>>>
What if you poll/select in your main instead of just waiting for a read?
When the poll/select times out, you can check for other conditions,
such as a flag from a thread, then loop back to the poll/select and
start the cycle over again.
David Filion
More information about the tuxCPProgramming
mailing list