Question about threading implementation
Jonathon McKitrick
jcm at FreeBSD-uk.eu.org
Sat Mar 5 15:02:58 PST 2005
Hi all,
I've been trying to port my new Linux app from work to run on BSD so I can
work on it at home. It links with -pthread on Linux, and -lc_r on FreeBSD.
It has a mutex, a lock, and a thread. The thread runs a loop that sleep()s
a second for 5 seconds, to simulate connecting to the instrument it will
control. Then it signals a condition.
struct thread_params {
int tp_flags;
pthread_t tp_tid;
pthread_mutex_t tp_lock;
pthread_cond_t tp_cond;
};
void *thread_init(void *arg)
{
struct thread_params *tp = (struct thread_params *)arg;
int i;
pthread_mutex_lock(&tp->tp_lock);
printf("Started thread.\n");
for (i = 1; i < 5; i++)
{
printf("Sleeping.\n");
sleep(1);
}
printf("Waking.\n");
printf("Stopping thread.\n");
pthread_cond_signal(&tp->tp_cond);
pthread_mutex_unlock(&tp->tp_lock);
printf("Stopped thread.\n");
return 0;
}
void MyClass::initialize()
{
static struct thread_params tp;
int err;
tp.tp_cond = PTHREAD_COND_INITIALIZER;
tp.tp_lock = PTHREAD_MUTEX_INITIALIZER;
err = pthread_mutex_lock(&tp.tp_lock);
if (err)
printf("Error on lock: %d\n", err);
err = pthread_create(&tp.tp_tid, NULL, thread_init, &tp);
if (err)
printf("Error on thread create: %d\n", err);
else
{
printf("Thread created.\n");
printf("Waiting...\n");
pthread_cond_wait(&tp.tp_cond, &tp.tp_lock);
printf("Signaled!\n");
pthread_mutex_unlock(&tp.tp_lock);
printf("Thread joining.\n");
pthread_join(tp.tp_tid, NULL);
printf("Thread joined.\n");
}
}
Linking with libc_r under FreeBSD, the thread runs for 5 seconds, then
signals the condition.
Thread created.
Waiting...
Started thread.
Sleeping.
Sleeping.
Sleeping.
Sleeping.
Waking.
Stopping thread.
Stopped thread.
Signaled!
Thread joining.
Thread joined.
--------------------------------------
When I use -lthread_xu, I get this:
Error on lock: 22
Thread created.
Started thread.
Waiting...
Sleeping.
Signaled!
Thread joining.
Thread joined.
----------------------------------------
There is no 5 second delay from the thread.
When I use -lc_r, I get this:
Fatal error 'Failed to initialise garbage collector mutex or condvar' at
line ? in file /usr/src/lib/libc_r/uthread/uthread_init.c (errno = ?)
zsh: abort (core dumped) app
What am I doing wrong?
Jonathon McKitrick
--
My other computer is your Windows box.
More information about the Users
mailing list