Question about threading implementation
Andrew Hacking
ahacking at optusnet.com.au
Sun Mar 6 17:45:29 PST 2005
Calling sleep() in a multi-threaded program is probably not safe since
it suspends the process, not just the thread.
You should always call nanosleep() in multi-threaded apps.
The core dump is not pretty through....
-Andrew.
On Sun, 2005-03-06 at 09:00, Jonathon McKitrick wrote:
> 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