🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ### 生产者-消费者问题 `生产者(进程) -> 缓存区 -> 消费者(进程)` - 单从生产者程序或消费者程序去看是没问题的 - 单两者并发执行时就可能出差错 >[warning] 根源问题:彼此相互之间没有通讯 示例:又线程锁与无线程锁的区别 <details> <summary>main.cpp</summary> ``` #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> #include <vector> pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; int num =0; void *producer(void*){ int times = 10000000; while(times--){ // pthread_mutex_lock(&mutex); num++; // pthread_mutex_unlock(&mutex); } } void *comsumer(void*){ int times = 10000000; while(times--){ // pthread_mutex_lock(&mutex); num--; // pthread_mutex_unlock(&mutex); } } int main(){ printf("stat in main function."); pthread_t thread1,thread2; pthread_create(&thread1,NULL,&producer,NULL); pthread_create(&thread2,NULL,&comsumer,NULL); pthread_join(thread1,NULL); pthread_join(thread2,NULL); printf("print in main function:num=%d",num); return 0; } ``` </details> <br /> ``` g++ main.cpp -o main ./main ``` ## 临界资源 - 临界资源指的是一些虽作为共享资源却又无法同时被多个线程共同访问的共享资源。 - 当有进程在使用临界资源时,其他进程必须依据操作系统的同步机制等待占用进程释放该共享资源才可重新竞争使用共享资源。 ## 进程间的同步 空闲让进:资源无占用,允许使用 忙则等待:资源有占用,请求进程等待 有限等待:保证有限等待时间能够使用资源 让权等待:等待时,进程需要让出CPU ## 进程同步的方法 1. 消息队列 2. 共享存储 3. 信号量