1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <pthread.h> 2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdio.h> 3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdlib.h> 4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <unistd.h> 5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/types.h> 6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic pthread_cond_t cond1; 9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic pthread_cond_t cond2; 10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic pthread_mutex_t test_lock = PTHREAD_MUTEX_INITIALIZER; 11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void * 13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectthread1_func(void* arg) 14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Thread 1 (arg=%d tid=%d) entered.\n", (unsigned)arg, gettid()); 16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("1 waiting for cond1\n"); 17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_mutex_lock(&test_lock); 18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_cond_wait(&cond1, &test_lock ); 19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_mutex_unlock(&test_lock); 20e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Thread 1 done.\n"); 21e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void * 25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectthread2_func(void* arg) 26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Thread 2 (arg=%d tid=%d) entered.\n", (unsigned)arg, gettid()); 28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("2 waiting for cond2\n"); 29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_mutex_lock(&test_lock); 30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_cond_wait(&cond2, &test_lock ); 31e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_mutex_unlock(&test_lock); 32e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 33e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Thread 2 done.\n"); 34e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 35e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 36e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 37e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void * 38e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectthread3_func(void* arg) 39e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Thread 3 (arg=%d tid=%d) entered.\n", (unsigned)arg, gettid()); 41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("3 waiting for cond1\n"); 42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_mutex_lock(&test_lock); 43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_cond_wait(&cond1, &test_lock ); 44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_mutex_unlock(&test_lock); 45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("3 Sleeping\n"); 46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project sleep(2); 47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("3 signal cond2\n"); 48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_cond_signal(&cond2); 49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Thread 3 done.\n"); 51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 52e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void * 55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectthread4_func(void* arg) 56e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Thread 4 (arg=%d tid=%d) entered.\n", (unsigned)arg, gettid()); 58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("4 Sleeping\n"); 59e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project sleep(5); 60e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 61e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("4 broadcast cond1\n"); 62e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_cond_broadcast(&cond1); 63e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project printf("Thread 4 done.\n"); 64e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 67e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint main(int argc, const char *argv[]) 68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_t t[4]; 70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_cond_init(&cond1, NULL); 72e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_cond_init(&cond2, NULL); 73e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_create( &t[0], NULL, thread1_func, (void *)1 ); 74e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_create( &t[1], NULL, thread2_func, (void *)2 ); 75e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_create( &t[2], NULL, thread3_func, (void *)3 ); 76e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_create( &t[3], NULL, thread4_func, (void *)4 ); 77e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 78e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_join(t[0], NULL); 79e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_join(t[1], NULL); 80e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_join(t[2], NULL); 81e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project pthread_join(t[3], NULL); 82e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 83e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 84