#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <vector>
#include <time.h>
#include <unistd.h>
#include <queue>
#include <cstring>
#include <string>
#include <functional>
using namespace std;
typedef function<void ()> task;
queue<task> iq;
pthread_mutex_t mutex;
pthread_cond_t full;
pthread_cond_t empty;
void* con(void* arg);
void fun()
{
printf("foo\n");
}
int main(int argc,const char* argv[])
{
if(argc<2)
{
perror("input\n");
exit(1);
}
vector<pthread_t> pvec(atoi(argv[1]));
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&full,NULL);
pthread_cond_init(&empty,NULL);
for(int i=0;i<atoi(argv[1]);++i)
{
if(pthread_create(&pvec[i],NULL,con,NULL)!=0)
{
perror("pthread create error\n");
exit(1);
}
}
while(1)
{
printf("*\n");
pthread_mutex_lock(&mutex);
while(iq.size()>2)
{
pthread_cond_wait(&full,&mutex);
}
sleep(1);
//fun();
iq.push(bind(&fun));
if(iq.size()>0)
{
pthread_cond_signal(&empty);
}
pthread_mutex_unlock(&mutex);
}
for(int i=0;i<atoi(argv[1]);++i)
{
if(pthread_join(pvec[i],NULL)!=0)
{
perror("pthread join error\n");
exit(1);
}
}
pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&full);
pthread_cond_destroy(&empty);
return 0;
}
void* con(void* arg)
{
//pthread_detach(pthread_self());
printf("con\n");
while(1)
{
pthread_mutex_lock(&mutex);
while(iq.empty())
{
pthread_cond_wait(&empty,&mutex);
}
//sleep(1);
iq.front()();//这里一定要加()
iq.pop();
if(iq.size()<=2)
{
pthread_cond_signal(&full);
}
pthread_mutex_unlock(&mutex);
}
return (void*)arg;
}
PS:线程池中主线程扮演生产者,新线程扮演消费者
g++ pool.cpp -std=c++0x -lpthread