//消费者函数
#include <unistd.h>
#include <fstream>
#include "global.h"
using namespace std;
void *blkConsumer(void *produceNum)
{
buff_node *p;
int *nproducers = (int *)produceNum;
for (;;)
{
//对互斥量 bufferMutex上锁
pthread_mutex_lock(&bufferMutex);
while(bufferNum == BUFFNUM)
//等待
pthread_cond_wait(&bufferReadCond, &bufferMutex);
//改变相应指针
p = head->next;
head->next = p->next;
if (tail == p)
{
tail = head;
}
//bufferNum加一
bufferNum++;
//释放信号量
pthread_cond_signal(&bufferWriteCond);
//对信号量bufferMutex解锁
pthread_mutex_unlock(&bufferMutex);
//得到一个块
if (p->node_id <= MAXBLOCK)
{
pthread_mutex_lock(&stdoutMutex);
cout << "get one block,id is: " << p->node_id<<endl;
pthread_mutex_unlock(&stdoutMutex);
}
if (p->node_id > MAXBLOCK)
{
//释放指针p
free(p);
if (p->node_id == (MAXBLOCK + *nproducers))
//释放头节点
free(head);
}
return NULL;
}
//对块进行写
if (write(fileFd, temp->buff, blockSize) == -1)
{
//对互斥量stderrMutex上锁
pthread_mutex_lock(&stderrMutex);
cerr <<"write error,block id is: "<< p->node_id<<endl;
//对互斥量 stderrMutex解锁
pthread_mutex_unlock(&stderrMutex);
//释放指针p
free(p);
continue;
}
else
{
//对互斥量stdoutMutex上锁
pthread_mutex_lock(&stdoutMutex);
cout <<"wirte block succeed, block id: "
<<p->node_id<<endl;
//对互斥量stdoutMutex解锁
pthread_mutex_unlock(&stdoutMutex);
//释放指针p
free(p);
}
}
return NULL;
}