// This file is for testing running "print object" in a case where another thread // blocks the print object from making progress. Set a breakpoint on the line in // my_pthread_routine as indicated. Then switch threads to the main thread, and // do print the lock_me object. Since that will try to get the lock already gotten // by my_pthread_routime thread, it will have to switch to running all threads, and // that should then succeed. // #include #include static pthread_mutex_t test_mutex; static void Mutex_Init (void) { pthread_mutexattr_t tmp_mutex_attr; pthread_mutexattr_init(&tmp_mutex_attr); pthread_mutex_init(&test_mutex, &tmp_mutex_attr); } @interface LockMe :NSObject { } - (NSString *) description; @end @implementation LockMe - (NSString *) description { printf ("LockMe trying to get the lock.\n"); pthread_mutex_lock(&test_mutex); printf ("LockMe got the lock.\n"); pthread_mutex_unlock(&test_mutex); return @"I am pretty special.\n"; } @end void * my_pthread_routine (void *data) { printf ("my_pthread_routine about to enter.\n"); pthread_mutex_lock(&test_mutex); printf ("Releasing Lock.\n"); // Set a breakpoint here. pthread_mutex_unlock(&test_mutex); return NULL; } int main () { pthread_attr_t tmp_attr; pthread_attr_init (&tmp_attr); pthread_t my_pthread; Mutex_Init (); LockMe *lock_me = [[LockMe alloc] init]; pthread_create (&my_pthread, &tmp_attr, my_pthread_routine, NULL); pthread_join (my_pthread, NULL); return 0; }