进程 | 生产者和消费者

这其实是操作系统上的内容,进程,系统分配资源的最小单位,线程,系统执行指令的最小单位(也可以叫执行任务)
操作系统,充分利用电气特性提升操作任务的性能,同时多进程提升并发执行性能。
现实生活中,生产者–消费者关系。
这是一个很强的一前一后、一前一后……的同步逻辑关系。
说白了,就像流水线。
这其实也是通信的一种,生产者–>缓存区—>消费者
当缓存区为空时,消费者通知生产者快点生产。此时消费者阻塞,生产者在跑。
当缓存区满的时候,生产者通知消费者,缓存区满了,我不能再生产了(生产者),此时生产者阻塞,消费者在跑。
可以通过加锁,实现,生产者生产一块饼干,消费者接着就吃一块饼干。

#include 
#include 
#include 

const int BUFFER_SIZE = 5;
std::vector<int> buffer;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t _cond = PTHREAD_COND_INITIALIZER;

void* producer(void* arg) {
    for (int i = 0; i < 10; ++i) {
        pthread_mutex_lock(&mutex);						//保护线程同步条件变量锁

        while (buffer.size() == BUFFER_SIZE) {
            // 缓冲区已满,等待消费者消费数据	生产者不能再生产数据
            std::cout << "Producer: Buffer is full. Waiting...\n";
            pthread_cond_wait(&_cond, &mutex);			//生产者在等 线程同步条件变量被消费者占用
        }

        buffer.push_back(i);
        std::cout << "Producer: Produced data: " << i << "\n";

        pthread_cond_signal(&_cond); // 唤醒等待的消费者线程 把线程同步条件变量释放,然后消费者可以占用
        pthread_mutex_unlock(&mutex);
    }

    return NULL;
}

void* consumer(void* arg) {
    for (int i = 0; i < 10; ++i) {
        pthread_mutex_lock(&mutex);

        while (buffer.empty()) {
            // 缓冲区为空,等待生产者生产数据
            std::cout << "Consumer: Buffer is empty. Waiting...\n";
            pthread_cond_wait(&_cond, &mutex);
        }

        int data = buffer.back();
        buffer.pop_back();
        std::cout << "Consumer: Consumed data: " << data << "\n";

        pthread_cond_signal(&_cond); // 唤醒等待的生产者线程
        pthread_mutex_unlock(&mutex);
    }

    return NULL;
}

int main() {
    pthread_t producerThread, consumerThread;
    pthread_create(&producerThread, NULL, producer, NULL);
    pthread_create(&consumerThread, NULL, consumer, NULL);

    pthread_join(producerThread, NULL);
    pthread_join(consumerThread, NULL);

    return 0;
}

pthread_join(producerThread, NULL);表示阻塞当前的main进程,让进程producerThread去跑
后面还有,哲学家吃饭问题、抽烟问题。
其实,后面还可以延伸到死锁问题,死锁预防(银行家算法),其本质就是按照一定规则推算,当下的所有资源能不能满足所有进程的执行,如果可以,这说明不会存在死锁,否者,会发生死锁。应当解决死锁问题。那么就涉及到如何解决死锁问题。

你可能感兴趣的:(linux)