一.线程同步的概念
- 线程同步:是指在互斥的基础上,通过其它机制实现访问者对 资源的有序访问。
- 条件变量:线程库提供的专门针对线程同步的机制
- 线程同步比较典型的应用场合就是 生产者与消费者
二、生产者与消费者模型原理
- 在这个模型中,包括生产者线程与消费者线程。通过线程来模拟多个线程同步的过程
- 在这个模型中,需要以下组件
- 仓库 : 用于存储产品,一般作为共享资源
- 生产者线程 : 用于生产产品
- 消费者线程 : 用于消费产品
- 原理
- 当仓库没有产品时,则消费者线程需要等待,直到有产品时才能消费
- 当仓库已经装满产品时,则生产者线程需要等待,直到消费者线程消费产品之后
三、生产者与消费者模型同步
using namespace std;
#include<iostream>
#include<string>
#include<vector>
#include<deque>
#include<ctime>
#include<deque>
#include<cstdlib>
#include<pthread.h>
#include <unistd.h>
int production = 0;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void * start_routinue(void* arg){int nsems = atoi((char*)arg);for(int i = 0;i < nsems;i++){pthread_mutex_lock(&mutex);production++;cout << pthread_self() << "生产了" << production << endl;sleep(1); pthread_mutex_unlock(&mutex);}pthread_exit(NULL);
}
int main(int argc,char* argv[]){if(argc < 2){cout << "error" << endl;exit(EXIT_FAILURE);}cout << argc << endl;int total_production = 0;int total_resumption = 0;vector<pthread_t> arr;for(int i = 1;i < argc;i++){arr.push_back(i);}for(int i = 0;i < arr.size();i++){total_production += atoi(argv[i + 1]);int ret = pthread_create(&(arr.at(i)),NULL,start_routinue,(void*)argv[i + 1]);if(ret != 0){cout << "create failed" << endl;exit(EXIT_FAILURE);}}while(1){pthread_mutex_lock(&mutex);while(production > 0){total_resumption++;production--;cout << pthread_self() << "消费了" << endl;sleep(1);}if(total_resumption == total_production){break;}pthread_mutex_unlock(&mutex);}
}