[Linux]多线程同步之sem_wait()学习笔记
2016-11-13 20:03
543 查看
1、semaphore 的这种信号量不仅可用于同一进程的线程同步,也可以用于不同进程间同步。
一个生产者-消费者例子:生产者不停的向一个固定大小的环形队列中添加数据,消费者从环形队列中清零数据,如果生产者积累的数据大于环形队列长度,则等待消费者清除数据有空位后再生产。
运行结果:
2、用Condition Variable实现Semaphore ,即用pthread_cond_wait()等方式实现sem_wait()等方式。
运行结果:
一个生产者-消费者例子:生产者不停的向一个固定大小的环形队列中添加数据,消费者从环形队列中清零数据,如果生产者积累的数据大于环形队列长度,则等待消费者清除数据有空位后再生产。
#include <stdlib.h> #include <pthread.h> #include <stdio.h> #include <semaphore.h> #include <unistd.h> #define NUM 5 int queue[NUM]; sem_t blank_number, product_number; void *producer(void *arg) { int p = 0; while(1){ sem_wait(&blank_number); queue[p] = rand() % 1000 + 1; printf("produce %d\n", queue[p]); p = (p + 1) % NUM; sem_post(&product_number); sleep(1); //sleep(rand()%5); } } void *consumer(void *arg) { int c = 0, i; while(1) { sem_wait(&product_number); for(i=0; i < NUM; i++) { printf("%d ", queue[i]); } putchar('\n'); printf("consume %d\n", queue[c]); queue[c] = 0; sem_post(&blank_number); c = (c+1)%NUM; sleep(3); //sleep(rand()%5); } } int main() { pthread_t pid, cid; // 可用资源数为 NUM = 5 sem_init(&blank_number, 0, NUM); sem_init(&product_number, 0, 0); pthread_create(&pid, NULL, producer, NULL); pthread_create(&cid, NULL, consumer, NULL); pthread_join(pid, NULL); pthread_join(cid, NULL); sem_destroy(&blank_number); sem_destroy(&product_number); return 0; }
运行结果:
2、用Condition Variable实现Semaphore ,即用pthread_cond_wait()等方式实现sem_wait()等方式。
#include <stdlib.h> #include <pthread.h> #include <stdio.h> #include <unistd.h> #define NUM 5 int queue[NUM]; int current_num; pthread_cond_t has_product = PTHREAD_COND_INITIALIZER; pthread_cond_t blank_product = PTHREAD_COND_INITIALIZER; pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; void *producer(void *arg) { int p = 0, i; while(1){ pthread_mutex_lock(&lock); while(current_num >= NUM) { pthread_cond_wait(&blank_product, &lock); } queue[p] = rand() % 1000 + 1; printf("produce %d\n", queue[p]); p = (p + 1) % NUM; current_num ++; pthread_mutex_unlock(&lock); printf("after produce --- current_num: %d\n", current_num); for(i=0; i < NUM; i++) { printf("%d ", queue[i]); } putchar('\n'); sleep(1); //sleep(rand()%5); pthread_cond_signal(&has_product); } } void *consumer(void *arg) { int c = 0, i; while(1) { pthread_mutex_lock(&lock); pthread_cond_wait(&has_product, &lock); printf("consume %d\n", queue[c]); queue[c] = 0; c = (c+1)%NUM; current_num--; printf("after consume --- current_num: %d\n", current_num); for(i=0; i < NUM; i++) { printf("%d ", queue[i]); } putchar('\n'); pthread_mutex_unlock(&lock); sleep(3); //sleep(rand()%5); pthread_cond_signal(&blank_product); } } int main() { pthread_t pid, cid; pthread_create(&pid, NULL, producer, NULL); pthread_create(&cid, NULL, consumer, NULL); pthread_join(pid, NULL); pthread_join(cid, NULL); printf("----\n"); return 0; }
运行结果:
相关文章推荐
- [Linux]多线程同步之pthread_cond_wait()学习笔记
- linux 进程间信号量管理程序之sem_timedwait使用
- 那年,一步一步学linux c ---sigprocmask 阻塞进程---sem_wait/sem_post
- Linux 信号量sem_wait(3) (翻译 man 3)
- linux 进程间信号量管理程序之sem_timedwait使用
- Linux编译错误:对‘sem_wait’未定义的引用
- Linux下pthread_cond_wait()多线程同步实例
- linux下生产者与消费者问题代码,以及编译c代码时error:undefined reference to sem_wait 解决方法之一
- 《深入理解LINUX内存管理》学习笔记(一)0.02.01修正版,红字部分为修正后的内容
- linux进程控制-wait()
- linux学习笔记
- linux进程控制-wait()
- linux内核的 等待队列 使用方法,wait_queue_head_t,进程休眠
- Linux系统进程控制编程(六)——wait和waitpid函数
- 减少Linux下Squid服务器的TIME_WAIT套接字数量
- 写得蛮好的linux学习笔记
- 减少Linux下Squid服务器的TIME_WAIT套接字数量
- linux多线程同步
- linux下解决大量的TIME_WAIT
- 转:Linux下解决APACHE的TIME_WAIT连接太多问题