Group: comp.lang.c++
From: Cholo Lennon
Date: Friday, February 15, 2008 2:41 PM
Subject: Re: waiting for another thread without blocking resources...

On Feb 15, 10:58 am, Lars Uffmann wrote:
> Cholo Lennon wrote:
> > PS: Could you provide some code to check the library use?
>
> boost::thread *THREAD_FileReceiver; // global variable
> int GLB_listen = 0; // global
> int GLB_listening = 0; // global
>
> // event handler function
> void OnToggleListen()
> {
> if (!GLB_listen) {
> if (GLB_listening) {
> cout << "error: still ending thread" << endl;
> return;
> }
> GLB_listen = 1; // set keepalive flag for thread
> cout << "starting thread" << endl;
>
> // this function is the threads main loop, receiving UDP packets
> THREAD_FileReceiver = new boost::thread(&listenForUDPFiles);
>
> // wait for thread to set GLB_Listening := 1 - how??
>
> // the following is the cmd button to toggle thread status
> mainWindow->cmdToggleListen->SetLabel ("Stop Listening");
> }
> else {
> if (!GLB_listening) {
> cout << "error: still starting thread" << endl;
> return;
> }
> GLB_listen = 0; // unset keepalive flag for thread
>
> // send a UDP packet to get thread out of listening mode
> sendEndOfStream();
>
> cout << "waiting for thread to end" << endl;
> THREAD_FileReceiver->join();
> cout << "thread finished, GLB_listening = " << GLB_listening << endl;
> delete THREAD_FileReceiver;
> THREAD_FileReceiver = 0;
>
> // the following is the cmd button to toggle thread status
> mainWindow->cmdToggleListen->SetLabel ("Start Listening");
> }
>
> }
>
> ---
> this code just crashes after the join() call while without it, the code
> would exit normally. However, then I have a possible race condition when
> re-activating the thread. Are you able to make anything from that?

Yes, it's possible that you have a race condition. Try locking the
section. Global variables aren't good, but using the same scheme:

...
boost::mutex GLB_mutex;

void OnToggleListen()
{
boost::scoped_lock(GLB_mutex);

// your code ...
}

Also, try locking global variable access in your thread function.

void listenForUDPFiles()
{
...

// Access shared flags (GLB_listen, GLB_listening)
{
boost::scoped_lock sl(GLB_mutex);

// update flags here
}
...
}

TODO: 1st Check if the solution work. 2nd Remove global variables and
optimize locking.


Regards

--
Cholo Lennon
Bs.As.
ARG