#include #include #include #include #include static pthread_mutex_t mutex; static const int use_dead_thread = 1; static void lock_attempt(char *tag) { int error; printf("%s: calling pthread_mutex_lock()...\n", tag); error = pthread_mutex_lock(&mutex); printf("%s: pthread_mutex_lock() finished, returned %d.\n", tag, error); } static void unlock_attempt(char *tag) { int error; printf("%s: calling pthread_mutex_unlock()...\n", tag); error = pthread_mutex_unlock(&mutex); printf("%s: pthread_mutex_unlock() finished, returned %d.\n", tag, error); } void * locker_thread(void *arg) { lock_attempt("Thread (L)"); return (NULL); } void * unlocker_thread(void *arg) { unlock_attempt("Thread (U)"); return (NULL); } int main(int argc, char *argv[]) { pthread_mutexattr_t mattr; pthread_t tid; assert(pthread_mutexattr_init(&mattr) == 0); assert(pthread_mutexattr_settype(&mattr, PTHREAD_MUTEX_NORMAL) == 0); assert(pthread_mutex_init(&mutex, &mattr) == 0); printf("\n"); printf("Checking unlock on mutex owned by non-dead thread.\n"); printf("--------------------------------------------------\n"); lock_attempt("Main"); pthread_create(&tid, NULL, unlocker_thread, (void *)NULL); pthread_join(tid, NULL); printf("\n"); pthread_mutex_trylock(&mutex); assert(pthread_mutex_unlock(&mutex) == 0); printf("Checking unlock on mutex owned by dead thread.\n"); printf("----------------------------------------------\n"); pthread_create(&tid, NULL, locker_thread, (void *)NULL); pthread_join(tid, NULL); unlock_attempt("Main"); return (0); }