#include #include #include #include #include pthread_mutex_t mtx; pthread_cond_t cnd; void * thread_simple(void *arg) { printf("thread_simple %p!\n", arg); return arg; } void * thread_lock(void *arg) { int i; int status; for (i = 0; i < 100; i++) { status = pthread_mutex_lock(&mtx); assert(status == 0); pthread_yield(); status = pthread_mutex_unlock(&mtx); assert(status == 0); } return NULL; } void * thread_cond(void *arg) { int i; int status; for (i = 0; i < 100; i++) { status = pthread_cond_wait(&cnd, NULL); assert(status == 0); status = pthread_cond_signal(&cnd); assert(status == 0); } return NULL; } int main(int argc, const char *argv[]) { int i; int status; pthread_t thr; void *result; printf("PThread Test\n"); // Simple thread Test printf("simple test\n"); status = pthread_create(&thr, NULL, thread_simple, NULL); assert(status == 0); status = pthread_join(thr, &result); assert(status == 0); assert(result == NULL); printf("\n"); // Return value Test printf("return value test\n"); status = pthread_create(&thr, NULL, thread_simple, (void *)1); assert(status == 0); status = pthread_join(thr, &result); assert(status == 0); assert(result == (void *)1); printf("\n"); // Mutex Test printf("simple mutex lock test\n"); status = pthread_mutex_init(&mtx, NULL); assert(status == 0); status = pthread_mutex_lock(&mtx); assert(status == 0); status = pthread_mutex_unlock(&mtx); assert(status == 0); status = pthread_mutex_destroy(&mtx); assert(status == 0); printf("\n"); // Mutex Contention Test printf("contended mutex lock test\n"); pthread_mutex_init(&mtx, NULL); status = pthread_create(&thr, NULL, thread_lock, (void *)1); assert(status == 0); for (i = 0; i < 100; i++) { status = pthread_mutex_lock(&mtx); assert(status == 0); pthread_yield(); pthread_mutex_unlock(&mtx); assert(status == 0); } status = pthread_join(thr, &result); assert(status == 0); status = pthread_mutex_destroy(&mtx); assert(status == 0); printf("\n"); // Condition Variable Test printf("simple condition variable test\n"); status = pthread_cond_init(&cnd, NULL); assert(status == 0); status = pthread_cond_signal(&cnd); assert(status == 0); status = pthread_cond_wait(&cnd, NULL); assert(status == 0); status = pthread_cond_destroy(&cnd); assert(status == 0); printf("\n"); printf("threaded condition variable test\n"); status = pthread_cond_init(&cnd, NULL); assert(status == 0); for (i = 0; i < 100; i++) { status = pthread_cond_signal(&cnd); assert(status == 0); status = pthread_cond_wait(&cnd, NULL); assert(status == 0); } status = pthread_cond_destroy(&cnd); assert(status == 0); printf("\n"); printf("Success!\n"); return 0; }