标签:介绍 互斥锁 span 1.5 idt sleep ima 成功 线程阻塞
1 #include <pthread.h> 2 int pthread_cond_init(pthread_cond_t *restrict cond, pthread_condattr_t *restrict attr); 3 int pthread_cond_destroy(pthread_cond_t *cond);
1 #include <pthread.h> 2 int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex); 3 int pthread_cond_timewait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex, const struct timespec *restrict timeout); 4 5 struct timespec { 6 time_t tv_sec; /** seconds */ 7 ong tv_nsec; /** nanoseconds */ 8 };
1 #include <pthread.h> 2 int pthread_cond_signal(pthread_cond_t *cond); 3 int pthread_cond_broadcast(pthread_cond_t *cond);
一个线程负责计算结果,一个线程负责获取结果
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <pthread.h> 4 #include <unistd.h> 5 6 /** 两个线程定义的共享资源 */ 7 typedef struct { 8 int res; 9 int is_wait; ///< 用户给出的用于判断的条件 10 pthread_cond_t cond; ///< 条件变量 11 pthread_mutex_t mutex; ///< 互斥锁 12 }Result; 13 14 15 /** 计算并将结果放置在 Result 中的线程运行函数 */ 16 void *set_fn(void *arg) 17 { 18 Result *r = (Result *)arg; 19 int i = 0; 20 int sum = 0; 21 22 for(; i <= 100; i++){ 23 sum += i; 24 } 25 26 /** 将结果放置到 Result 中 */ 27 r->res = sum; 28 29 pthread_mutex_lock(&r->mutex); 30 /** 判断获取结果的线程是否准备好 */ 31 while(!r->is_wait){ 32 pthread_mutex_unlock(&r->mutex); 33 usleep(100); 34 pthread_mutex_lock(&r->mutex); 35 } 36 pthread_mutex_unlock(&r->mutex); 37 38 /** 通知唤醒等待的那个获取结果的线程 */ 39 pthread_cond_broadcast(&r->cond); 40 41 return (void *)0; 42 } 43 44 /** 获得结果的线程运行函数 */ 45 void *get_fn(void *arg) 46 { 47 Result *r = (Result *)arg; 48 49 /** 对两个线程共享的判断条件进行保护(加锁) */ 50 /** 两个线程对判断条件的操作是互斥的 */ 51 pthread_mutex_lock(&r->mutex); 52 /** 当线程启动后,将此变量设置为1,代表此线程已经准备好了 */ 53 r->is_wait = 1; 54 55 /** 获取结果的线程等待 */ 56 pthread_cond_wait(&r->cond, &r->mutex); 57 58 /** 被唤醒后 */ 59 pthread_mutex_unlock(&r->mutex); 60 61 /** 去获取计算结果 */ 62 int res = r->res; 63 printf("0x%lx get sum is %d\n", pthread_self(), res); 64 65 return (void *)0; 66 } 67 68 int main(void) 69 { 70 int err; 71 pthread_t cal, get; 72 73 Result r; 74 r.is_wait = 0; 75 pthread_cond_init(&r.cond, NULL); 76 pthread_mutex_init(&r.mutex, NULL); 77 78 /** 启动获取结果的线程 */ 79 if((err = pthread_create(&get, NULL, get_fn, (void *)&r)) != 0){ 80 perror("pthread create error"); 81 } 82 83 /** 启动计算结果的线程 */ 84 if((err = pthread_create(&cal, NULL, set_fn, (void *)&r)) != 0){ 85 perror("pthread create error"); 86 } 87 88 pthread_join(cal, NULL); 89 pthread_join(get, NULL); 90 91 pthread_cond_destroy(&r.cond); 92 pthread_mutex_destroy(&r.mutex); 93 94 pthread_cond_destroy(&r.cond); 95 pthread_mutex_destroy(&r.mutex); 96 return 0; 97 }
编译执行结果:
标签:介绍 互斥锁 span 1.5 idt sleep ima 成功 线程阻塞
原文地址:https://www.cnblogs.com/kele-dad/p/10230340.html