Re: Threading question (avoiding deadlock)
- From: Paul Davis <pbd Op Net>
- To: Pascal Haakmat <a haakmat chello nl>
- Cc: gtk-list gnome org, gtk-app-devel-list gnome org
- Subject: Re: Threading question (avoiding deadlock)
- Date: Sun, 17 Mar 2002 11:54:34 -0500
>I was hoping somebody could point me in the right direction here.
your periodic update thread should check a variable that tells it to
die. add a lock and a condition variable, and use it like this:
void
kill_periodic_thread ()
{
pthread_mutex_lock(&lock_protecting_kill_flag);
kill_flag = TRUE;
pthread_cond_wait (&periodic_is_dead, &lock_protecting_kill_flag);
/* at this point we know that barring a segfault,
the periodic thread is going to exit.
*/
pthread_mutex_unlock(&lock_protecting_kill_flag);
pthread_join();
}
void *
periodic_thread (void *arg)
{
while (!kill_flag) {
.... do stuff ....
}
if (kill_flag) {
... clean up ...
pthread_mutex_lock (&lock_protecting_kill_flag);
pthread_cond_signal (&periodic_is_dead);
pthread_mutex_unlock (&lock_protecting_kill_flag);
pthread_exit ();
}
...
}
note: you don't really to need to lock before checking kill_flag on
most architectures, but you might prefer:
pthread_mutex_lock (&lock_protecting_kill_flag);
if (kill_flag) {
... clean up ...
pthread_cond_signal (&periodic_is_dead);
pthread_mutex_unlock (&lock_protecting_kill_flag);
pthread_exit ();
}
pthread_mutex_unlock (&lock_protecting_kill_flag);
if you want to be more formal. you might also be able to get away
without the condition variable, and just use:
kill_flag = TRUE;
pthread_join (...);
although this becomes harder to debug under some circumstances.
--p
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]