Boost logo

Threads-Devel :

Subject: Re: [Threads-devel] [thread] notify of a condition variable doesn't work with a fork ?
From: nico (nicolas.guillot_at_[hidden])
Date: 2011-08-11 15:25:43


Sorry my question is not about boost, I sent it 1 minute too early, the
answer is obvious: the thread notifying is already running, and is not
"forked"...

Sorry for the noise.

Nicolas.

On Thu, Aug 11, 2011 at 9:19 PM, nico <nicolas.guillot_at_[hidden]> wrote:

> Hello.
>
> I wrote a simple program that use the condition_variable class to
> synchronize 2 threads, as explained here :
>
> http://www.boost.org/doc/libs/1_47_0/doc/html/thread/synchronization.html#thread.synchronization.condvar_ref
>
> When I fork a a given point (see example below), the wait of the
> condition_variable never ends.
> (I tried the code on ubuntu and fedora, and with boost 1.41 and boost
> 1.44).
>
> I can't explain why, and how to solve (or workaround).
>
> If I fork at the beginning of the program, it's ok.
>
> Here follows the code,
> the output is:
>
> going to wait
> End of processus of pid [5092]
>
> and the code is:
>
> #include <iostream>
> #include "boost/thread.hpp"
> #include "boost/bind.hpp"
> #include <signal.h>
> #include <cstdlib>
>
> using namespace std;
>
> boost::mutex mut;
> boost::condition_variable cond_var;
> bool cond;
>
> void MyThread()
> {
> sleep(3);
> {
> boost::lock_guard<boost::mutex> lock(mut);
> cond = true;
> }
> cond_var.notify_one();
> }
>
>
> int main()
> {
> pid_t pid;
>
> cond = false;
>
> boost::thread(boost::bind(MyThread));
>
> pid = fork();
> if (pid == 0)
> {
> boost::unique_lock<boost::mutex> lock(mut);
>
> while (cond == false)
> {
> cout << "going to wait" << endl;
> cond_var.wait(lock);
> cout << "awake" << endl;
> }
>
> cout << "continue" << endl;
> }
> else
> {
> sleep(10);
> }
>
> cout << "End of processus of pid [" << pid << "]" << endl;
> }
>
> thanks for help!
>
> Nicolas.
>



Threads-Devel list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk