pthead_cond_t 的使用
源代码1:
1 #include <stdio.h> 2 #include <pthread.h> 3 #include <stdlib.h> 4 #include <unistd.h> 5 6 pthread_cond_t qready = PTHREAD_COND_INITIALIZER; 7 pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER; 8 int constant = 0; 9 10 void *prints(void *arg) 11 { 12 pthread_mutex_lock(&qlock); 13 pthread_t tid = pthread_self(); 14 while (constant <10) 15 { 16 pthread_cond_wait(&qready, &qlock); 17 } 18 printf("After while thread %u, Constant is %d\n", 19 (unsigned int)tid, constant); 20 pthread_mutex_unlock(&qlock); 21 pthread_exit((void *)tid); 22 } 23 24 void *incre(void *arg) 25 { 26 pthread_mutex_lock(&qlock); 27 pthread_t tid = pthread_self(); 28 while ( ++constant < 20) 29 { 30 printf("In while thread %u, Constant is %d\n", 31 (unsigned int)tid, constant); 32 33 if (constant == 10) { // 注意这里 34 pthread_mutex_unlock(&qlock); 35 pthread_cond_signal(&qready); 36 pthread_mutex_lock(&qlock); 37 } 38 } 39 printf("Now the constant is %d\n", constant); 40 /* 41 constant += 10; 42 if (constant == 10) 43 pthread_cond_signal(&qready); 44 */ 45 pthread_mutex_unlock(&qlock); 46 47 pthread_exit((void *)tid); 48 } 49 50 int main() 51 { 52 int err; 53 pthread_t tid0, tid1; 54 55 err = pthread_create(&tid0, NULL, prints, NULL); 56 if (err != 0) 57 { 58 printf("can't create thread: %d \n", strerror(err)); 59 exit(0); 60 } 61 62 sleep(1); 63 err = pthread_create(&tid1, NULL, incre, NULL); 64 if (err != 0) 65 { 66 printf("can't create thread: %d \n", strerror(err)); 67 exit(0); 68 } 69 sleep(1); 70 71 exit(0); 72 }
运行结果1:
源代码2:
1 #include <stdio.h> 2 #include <pthread.h> 3 #include <stdlib.h> 4 #include <unistd.h> 5 6 pthread_cond_t qready = PTHREAD_COND_INITIALIZER; 7 pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER; 8 int constant = 0; 9 10 void *prints(void *arg) 11 { 12 pthread_mutex_lock(&qlock); 13 pthread_t tid = pthread_self(); 14 while (constant <10) 15 { 16 17 pthread_cond_wait(&qready, &qlock); 18 } 19 printf("After while thread %u, Constant is %d\n", 20 (unsigned int)tid, constant); 21 pthread_mutex_unlock(&qlock); 22 pthread_exit((void *)tid); 23 } 24 25 void *incre(void *arg) 26 { 27 pthread_mutex_lock(&qlock); 28 pthread_t tid = pthread_self(); 29 while ( ++constant < 20) 30 { 31 printf("In while thread %u, Constant is %d\n", 32 (unsigned int)tid, constant); 33 34 if (constant == 10) { // 注意这里 35 // pthread_mutex_unlock(&qlock); 36 pthread_cond_signal(&qready); 37 // pthread_mutex_lock(&qlock); 38 } 39 } 40 printf("Now the constant is %d\n", constant); 41 /* 42 constant += 10; 43 if (constant == 10) 44 pthread_cond_signal(&qready); 45 */ 46 pthread_mutex_unlock(&qlock); 47 48 pthread_exit((void *)tid); 49 } 50 51 int main() 52 { 53 int err; 54 pthread_t tid0, tid1; 55 56 err = pthread_create(&tid0, NULL, prints, NULL); 57 if (err != 0) 58 { 59 printf("can't create thread: %d \n", strerror(err)); 60 exit(0); 61 } 62 63 sleep(1); 64 err = pthread_create(&tid1, NULL, incre, NULL); 65 if (err != 0) 66 { 67 printf("can't create thread: %d \n", strerror(err)); 68 exit(0); 69 } 70 sleep(1); 71 72 exit(0); 73 }
运行结果:
其中,虽然函数pthread_wait_cond()之前,该线程已经持有锁。但是在该函数阻塞时,将释放掉锁。因此,只有只有锁的线程释放掉,才能继续从pthread_wait_cond()之后执行,因为该函数将再次获得锁的控制权。