|
Boost Users : |
From: Aubrey, Jason (jason.aubrey_at_[hidden])
Date: 2006-08-24 10:03:36
I can accept that I should use a condition variable for this situation
but I'm still not understanding the reason why.
If the intent of join is to block until the thread has completed, why
doesn't it just return when it realizes the thread has completed? Also
how is the second call any different from the first call occurring after
the thread has completed?
Apparently the C# designers had my same perspective since the following
completes without error:
// C# sample program to demonstrate join() semantics
using System.Threading;
namespace Test1
{
class Sample
{
void f(){}
static void Main(string[] args)
{
Sample s = new Sample();
Thread t = new Thread(new ThreadStart(s.f));
t.Start();
t.Join();
t.Join(); // No exception is thrown here, call simply
returns
}
}
}
Regards,
Jason
-----Original Message-----
From: boost-users-bounces_at_[hidden]
[mailto:boost-users-bounces_at_[hidden]] On Behalf Of Ovanes
Markarian
Sent: Thursday, August 24, 2006 4:25 AM
To: boost-users_at_[hidden]
Subject: Re: [Boost-users] [Boost-Threads] Assertion during a second
call to thread::join()
I think what you need is a condition variable and not join.
You can use notify_one and notify_all member of a common condition
variable to wake up one or respective all waiting threads:
http://www.boost.org/doc/html/condition.html
Please read this article in DDJ about boost threads there is written how
to handle different threading issues:
http://www.ddj.com/dept/cpp/184401518
With Kind Regards,
Ovanes Markarian
On Thu, August 24, 2006 09:05, Sascha Seewald wrote:
>
>
> Aubrey, Jason wrote:
>> Hi,
>>
>> Does anyone know the reason for the behavior in the following example
>> program?
>>
>> This example attempts to simulate the scenario where two threads wait
>> on a third thread. However, I realize that the following is actually
>> one thread waiting on a second thread twice.
>>
>> Regards,
>> Jason
>>
>> My Environment: MSVC 8.0, boost v1.33.1
>>
>> #include <boost/thread/thread.hpp>
>> #include <boost/thread/xtime.hpp>
>>
>> void f()
>> {
>> }
>>
>> void main()
>> {
>> boost::thread t(f);
>> t.join();
>> t.join(); // Causes an assertion
>
> A call to thread::join() requires the thread to be joinable. After the
> first call to join() the thread has finished and is not joinable
anymore.
> If you'd like to execute f twice, create a seperate thread for each
run.
>
> hth
>
> Sascha
>
> _______________________________________________
> Boost-users mailing list
> Boost-users_at_[hidden]
> http://lists.boost.org/mailman/listinfo.cgi/boost-users
>
_______________________________________________
Boost-users mailing list
Boost-users_at_[hidden]
http://lists.boost.org/mailman/listinfo.cgi/boost-users
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net