c++ 生产者与消费者
#include<iostream> #include<cstring> #include<algorithm> #include<thread> #include<mutex> #include<Windows.h> #include<condition_variable> using namespace std; const int buffer_size = 10;//缓冲区大小 const int num = 100;//要交互的商品个数 /* 说清楚,只有两个进程,生产者和消费者, 一个全局缓冲区,头指针l,尾指针r */ mutex aa; struct buff { int val[buffer_size]; int l, r; mutex mtx; condition_variable full, nofull; }buffer; void init(buff* chal) { chal->l = chal->r = 0; } void pr_do(buff* a, int item) {//添加item商品进入缓冲区 unique_lock<mutex>lock(a->mtx);//这句话的意思就是 执行这个函数的时候不能被别的进程打扰 while ((a->r + 1) % buffer_size == a->l) {//如果满了 cout << "\t\t满了别加入了" << endl; (a->full).wait(lock);//暂时给a的缓冲区解锁,并且阻塞当前线程。(当wait函数return后继续上锁) } //可以加入 a->val[(a->r)] = item; a->r++; a->r %= buffer_size; //现在肯定有商品了,因为缓冲区空被阻塞的线程可以唤醒了 (a->nofull).notify_all(); lock.unlock(); } void user(); void porduce() {//生产商品的进程 for (int i = 1; i <= num; i++) { unique_lock<mutex>lock(aa); cout << "\t\t放入商品" << i << endl; pr_do(&buffer, i); } } int user_do(buff* a) { unique_lock<mutex>lock(a->mtx);//这句话的意思就是 执行这个函数的时候不能被别的进程打扰 while (a->l == a->r) {//空 cout << "没有商品可以取" << endl; (a->nofull).wait(lock);//阻塞当前线程,解锁缓冲区 } int date = 0; date = a->val[a->l]; a->l++; a->l %= buffer_size; (a->full).notify_all(); lock.unlock(); return date; } void user() { int t = num; while (t) { Sleep(1); int date = user_do(&buffer); cout << "获得商品" << date << endl; t--; } } int main() { init(&buffer); thread prodece(porduce); thread user(user); prodece.join(); user.join(); return 0; }
输出可能有不整齐的现象,是因为a线程回车输出之前就切换为了别的进程,导致错乱,但是不影响结果吧
寻找真正的热爱