Hello misc@, doing some C programming with threads (yeah *ugh*), I discovered a strange issue.
There seems to be some problem using "static mutexes" (a mutex not created by pthread_mutex_init()). Here is some test code which works very well on linux, but gives: ------> (ID:2238337024) First mutex_prob: thread1: pthread_mutex_unlock() (0): Undefined error: 0 on OpenBSD. The output should look like: ------> (ID:<somenumber>) First Second Thread <somenumber2> done Thread <somenumber3> done <------ (ID:<somenumber>) the mutex is looked by the main-thread and only thread1 may print without locking the mutex first, thus "First" will always be printed first. If this is not a bug, perhaps somebody can point out the API difference between OpenBSD and Linux I missed. Regards ahb Test code: #include <err.h> #include <errno.h> #include <pthread.h> #include <stdio.h> #include <stdlib.h> /* static mutex var */ static pthread_mutex_t fz_mutex = PTHREAD_MUTEX_INITIALIZER; static void thread1(void *name) { printf("First\n"); /* free Mutex */ if (pthread_mutex_unlock(&fz_mutex) != 0) err(1, "thread1: pthread_mutex_unlock() (%d)", errno); /* thread end */ pthread_exit((void *)pthread_self()); } static void thread2(void *name) { /* lock Mutex */ pthread_mutex_lock(&fz_mutex); printf("Second\n"); /* free Mutex again */ if (pthread_mutex_unlock(&fz_mutex) != 0) err(1, "thread2: pthread_mutex_unlock() (%d)", errno); /* thread end */ pthread_exit((void *)pthread_self()); } int main(void) { static pthread_t th1, th2; static int ret1, ret2; /* main thread */ printf("\n------> (ID:%lu)\n", pthread_self()); /* lock mutex */ pthread_mutex_lock(&fz_mutex); /* Threads erzeugen */ if (pthread_create(&th1, NULL, (void *)&thread1,NULL) != 0) err(1, "pthread_create(th1)"); if (pthread_create(&th2, NULL, (void *)&thread2,NULL) != 0) err(1, "pthread_create(th2)"); /* Wait for both threads to finish */ pthread_join(th1, (void *)&ret1); pthread_join(th2, (void *)&ret2); printf("Thread %lu done\n", th1); printf("Thread %lu done\n", th2); printf("<----- (ID: %lu)\n", pthread_self()); return EXIT_SUCCESS; } Compile: gcc -o foo foo.c -lpthread