This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Strange testsuite/thread/pthread1.cc
- From: "H . J . Lu" <hjl at lucon dot org>
- To: gcc at gcc dot gnu dot org, ljrittle at acm dot org
- Date: Fri, 25 Jan 2002 17:37:33 -0800
- Subject: Strange testsuite/thread/pthread1.cc
In testsuite/thread/pthread1.cc, there are
pthread_mutex_t fooLock;
// This code uses a special case that allows us to use just one
// condition variable - in general, don't use this idiom unless you
// know what you are doing. ;-)
pthread_cond_t fooCond;
};
void*
produce (void* t)
{
task_queue& tq = *(static_cast<task_queue*> (t));
int num = 0;
while (num < iters)
{
pthread_mutex_lock (&tq.fooLock);
while (tq.foo.size () >= max_size)
pthread_cond_wait (&tq.fooCond, &tq.fooLock);
tq.foo.push_back (num++);
pthread_cond_signal (&tq.fooCond);
pthread_mutex_unlock (&tq.fooLock);
}
return 0;
}
void*
consume (void* t)
{
task_queue& tq = *(static_cast<task_queue*> (t));
int num = 0;
while (num < iters)
{
pthread_mutex_lock (&tq.fooLock);
while (tq.foo.size () == 0)
pthread_cond_wait (&tq.fooCond, &tq.fooLock);
if (tq.foo.front () != num++)
abort ();
tq.foo.pop_front ();
pthread_cond_signal (&tq.fooCond);
pthread_mutex_unlock (&tq.fooLock);
}
return 0;
}
I don't see how it can work. You have no control which thread will run
at any given time. As the result, produce/consume may send singal to
itself, which leads to dead lock. It happens on Linux/mips. May I ask
why only one condition variable is used?
H.J.