#include #include #include MUTEX mutex; COND cond; MUTEX stdio; void work1(void* arg) { int* num = (int*)arg; for (int i = 0; i < 100; i++) { thread_mutex_lock(&mutex); tfprintf(&stdio, stdout, "%d => %d\n", thread_self(), (*num)++); thread_mutex_unlock(&mutex); } } int test1() { int res; #define MAX1 2 TID tid[MAX1] = { 0 }; int num = 1; for (int i = 0; i < MAX1; i++) { if (thread_create(&tid[i], work1, &num) != 0) { return -2; } } for (int i = 0; i < MAX1; i++) { res = thread_join(tid[i]); if (res != 0) { return res; } } return 0; } void work2(void* arg) { thread_mutex_lock(&mutex); thread_cond_wait(&cond, &mutex); tfprintf(&stdio, stdout, "<%lu>\n", thread_self()); thread_mutex_unlock(&mutex); } int test2() { int res; #define MAX 6 TID tid[MAX] = { 0 }; for (int i = 0; i < MAX; i++) { if (thread_create(&tid[i], work2, NULL) != 0) { return -2; } } tfprintf(&stdio, stdout, "press enter to continue\n"); if (getchar()); thread_cond_singal(&cond); sleeps(1); tfprintf(&stdio, stdout, "press enter to continue\n"); if (getchar()); thread_cond_broadcast(&cond); for (int i = 0; i < MAX; i++) { res = thread_join(tid[i]); if (res != 0) { return res; } } return 0; } int main() { int res; if (thread_mutex_init(&mutex) != 0) { return -1; } if (thread_mutex_init(&stdio) != 0) { return -1; } tfprintf(&stdio, stdout, "test1 start...\n"); res = test1(); if (res != 0) { return res; } tfprintf(&stdio, stdout, "test1 end...\n"); if (thread_cond_init(&cond) != 0) { return -2; } tfprintf(&stdio, stdout, "test2 start...\n"); res = test2(); if (res != 0) { return res; } tfprintf(&stdio, stdout, "test2 end...\n"); if(getchar()); if (thread_mutex_destroy(&mutex) != 0) { return -3; } if (thread_cond_destroy(&cond) != 0) { return -4; } return 0; }