- 信号量API
-
#include <semaphore.h> 2 //等待互斥量(原子操作) 3 int sem_wait(sem_t *serm); 4 //通知互斥量加一 5 int sem_post(sem_t *sem);
-
- 基于信号量与互斥锁实现的生产者和消费者
-
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> 4 #include <sys/types.h> 5 #include <pthread.h> 6 #include <errno.h> 7 #include <string.h> 8 #include <semaphore.h> 9 10 #define ERR_EXIT(m)\ 11 do\ 12 {\ 13 perror(m);\ 14 exit(EXIT_FAILURE);\ 15 }while(0)\ 16 17 #define CONSUMER_COUNT 1 18 #define PRODUCE_COUNT 2 19 20 #define BUFFSIZE 10 21 int g_buffer[BUFFSIZE]; 22 23 unsigned short in = 0; 24 unsigned short out = 0; 25 unsigned short produce_id = 0; 26 unsigned short consume_id = 0; 27 28 sem_t g_sem_full; 29 sem_t g_sem_empty; 30 31 pthread_mutex_t g_mutex; 32 33 pthread_t g_thread[CONSUMER_COUNT+PRODUCE_COUNT]; 34 35 void* consume(void* arg) 36 { 37 int num= (int*)arg; 38 int i; 39 while(1) 40 { 41 printf("%d wait buffer not empty\n",num); 42 sem_wait(&g_sem_empty); 43 pthread_mutex_lock(&g_mutex); 44 45 for(i = 0; i< BUFFSIZE; i++) 46 { 47 printf("%02d ",i); 48 if(g_buffer[i] == -1) 49 printf("%s","null"); 50 else 51 printf("%d",g_buffer[i]); 52 if(i == out) 53 printf("\t<--consume"); 54 printf("\n"); 55 } 56 57 consume_id = g_buffer[out]; 58 printf("%d begin consume product %d\n",num, consume_id); 59 g_buffer[out] = -1; 60 out = (out + 1)%BUFFSIZE; 61 printf("%d end consume produce %d\n",num,consume_id); 62 63 pthread_mutex_unlock(&g_mutex); 64 sem_post(&g_sem_full); 65 sleep(1); 66 } 67 return NULL; 68 } 69 70 void* produce(void* arg) 71 { 72 int num = (int*)arg; 73 int i; 74 while(1) 75 { 76 printf("%d wait buffer not full\n",num); 77 sem_wait(&g_sem_full); 78 pthread_mutex_lock(&g_mutex); 79 80 for(i = 0; i< BUFFSIZE; i++) 81 { 82 printf("%02d ",i); 83 if(g_buffer[i] == -1) 84 printf("%s","null"); 85 else 86 printf("%d",g_buffer[i]); 87 if(i == in) 88 printf("\t<--produce"); 89 printf("\n"); 90 } 91 92 printf("%d begin produce product %d\n",num, produce_id); 93 g_buffer[in] = produce_id; 94 in = (in + 1)%BUFFSIZE; 95 printf("%d end produce produce %d\n",num,produce_id++); 96 97 pthread_mutex_unlock(&g_mutex); 98 sem_post(&g_sem_empty); 99 sleep(1); 100 } 101 return NULL; 102 } 103 104 int main(void) 105 { 106 int i; 107 for(i = 0; i < BUFFSIZE;i++) 108 g_buffer[i] = -1; 109 sem_init(&g_sem_full, 0, BUFFSIZE); 110 sem_init(&g_sem_empty, 0, 0); 111 112 pthread_mutex_init(&g_mutex,NULL); 113 114 for(i = 0; i< CONSUMER_COUNT; i++) 115 { 116 pthread_create(&g_thread[i], NULL,consume, (void*)i); 117 } 118 119 for(i = 0; i< PRODUCE_COUNT; i++) 120 { 121 pthread_create(&g_thread[i], NULL,produce, (void*)i); 122 } 123 124 for(i = 0; i < CONSUMER_COUNT + PRODUCE_COUNT; i++) 125 { 126 pthread_join(g_thread[i],NULL); 127 } 128 129 130 pthread_mutex_destroy(&g_mutex); 131 sem_destroy(&g_sem_full); 132 sem_destroy(&g_sem_empty); 133 134 135 return 0; 136 }
-
基于信号量与互斥锁实现的生产者和消费者
猜你喜欢
转载自www.cnblogs.com/zhaohu/p/9033265.html
今日推荐
周排行