条件变量
#include<iostream>
#include<memory>
#include<unistd.h>
#include<pthread.h>
#include<queue>
using namespace std;
queue<int> buffer;
pthread_mutex_t mutex;
pthread_cond_t cond;
void* producer(void* arg)
{
while(1){
pthread_mutex_lock(&mutex);
int id = rand() % 100;
buffer.push(id);
printf("生产者放入:%d\n",id);
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
void* customer(void* arg)
{
while(1){
pthread_mutex_lock(&mutex);
if(buffer.empty()){
//阻塞条件:缓冲区为空时,释放互斥锁
pthread_cond_wait(&cond,&mutex);
}
int ret = buffer.front();
buffer.pop();
printf("消费者取出:%d\n",ret);
pthread_mutex_unlock(&mutex);
}
}
int main(int argc, const char* argv[])
{
pthread_mutex_init(&mutex,nullptr);
pthread_cond_init(&cond,nullptr);
pthread_t p1,p2;
pthread_create(&p1,nullptr,producer,nullptr);
pthread_create(&p2,nullptr,customer,nullptr);
pthread_join(p1,nullptr);
pthread_join(p2,nullptr);
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
return 0;
}
信号量
#include<iostream>
#include<queue>
#include<pthread.h>
#include<semaphore.h>
#include<unistd.h>
using namespace std;
sem_t emptyBuffer;
sem_t fullBuffer;
pthread_mutex_t mutex;
queue<int> buffer;
void *producer(void *arg){
while(1){
sem_wait(&emptyBuffer);
pthread_mutex_lock(&mutex);
int id = (rand() % 100);
buffer.push(id);
printf("生产者放入:%d\n",id);
pthread_mutex_unlock(&mutex);
sem_post(&fullBuffer);
sleep(1);
}
}
void *customer(void *arg){
while(1){
sem_wait(&fullBuffer);
pthread_mutex_lock(&mutex);
int ret = buffer.front();
buffer.pop();
printf("消费者取出:%d\n",ret);
pthread_mutex_unlock(&mutex);
sem_post(&emptyBuffer);
}
}
int main(){
pthread_mutex_init(&mutex,NULL);
sem_init(&emptyBuffer,0,1);
sem_init(&fullBuffer,0,0);
pthread_t p1,p2;
pthread_create(&p1,NULL,producer,NULL);
pthread_create(&p2,NULL,customer,NULL);
pthread_join(p1,NULL);
pthread_join(p2,NULL);
sem_destroy(&fullBuffer);
sem_destroy(&emptyBuffer);
pthread_mutex_destroy(&mutex);
}