当前位置: 技术问答>linux和unix
大家看看我的生产者消费者问题编程有没有问题....
来源: 互联网 发布时间:2016-02-17
本文导语: 问题描述: (1)一个Productor线程,一个Consumer线程 (3)Producter线程来产生一个消息给队列,Consumer线程来取走这个消息并打印. (4)使用semaphore来进行线程间同步,mutex对critical area进行互斥 (一)队列头文件和源文件 #ifndef MYINTQUE...
问题描述:
(1)一个Productor线程,一个Consumer线程
(3)Producter线程来产生一个消息给队列,Consumer线程来取走这个消息并打印.
(4)使用semaphore来进行线程间同步,mutex对critical area进行互斥
(一)队列头文件和源文件
(二)线程文件
程序我运行了一下,结果没有出现什么问题.
但是还是要请教:
(1)我的同步方法有没有什么我没想到的问题?
(2)printf();函数并不能实时打印的字符,我用sync()和fflush()都没有能同步打印,请教一下有没有好的方法
(1)一个Productor线程,一个Consumer线程
(3)Producter线程来产生一个消息给队列,Consumer线程来取走这个消息并打印.
(4)使用semaphore来进行线程间同步,mutex对critical area进行互斥
(一)队列头文件和源文件
#ifndef MYINTQUEUE_H_
#define MYINTQUEUE_H_
#include
#include
#include
const int BUF_SIZE = 10;
class MyIntQueue
{
public:
int Buffer[BUF_SIZE];
unsigned int in_pos;
unsigned int out_pos;
sem_t sem_full;
sem_t sem_empty;
pthread_mutex_t mutex;
public:
MyIntQueue();
virtual ~MyIntQueue();
void push(int iItem);
void pop(int &iItem);
};
#endif /*MYINTQUEUE_H_*/
#include "MyIntQueue.h"
MyIntQueue::MyIntQueue()
{
bzero(this->Buffer, BUF_SIZE);
this->in_pos = 0;
this->out_pos = 0;
sem_init(&(this->sem_full),0,0);
sem_init(&(this->sem_empty),0,BUF_SIZE);
pthread_mutex_init(&(this->mutex),NULL);
}
MyIntQueue::~MyIntQueue()
{
sem_destroy(&(this->sem_empty));
sem_destroy(&(this->sem_full));
pthread_mutex_destroy(&(this->mutex));
}
void MyIntQueue::push(int iItem)
{
sem_wait(&sem_empty);
pthread_mutex_lock(&mutex);
Buffer[in_pos++] = iItem;
in_pos = (in_pos)%BUF_SIZE;
pthread_mutex_unlock(&mutex);
sem_post(&sem_full);
}
void MyIntQueue::pop(int &iItem)
{
sem_wait(&sem_full);
pthread_mutex_lock(&mutex);
iItem = Buffer[out_pos++];
out_pos = out_pos%BUF_SIZE;
pthread_mutex_unlock(&mutex);
sem_post(&sem_empty);
}
(二)线程文件
#include
#include
#include
#include "MyIntQueue.h"
void *Producter(void *arg);
void *Consumer(void *arg);
MyIntQueue IntQueue;
int main(void)
{
pthread_t producter;
pthread_t consumer;
pthread_create(&producter,NULL,&Producter,NULL);
pthread_create(&consumer,NULL,&Consumer,NULL);
int c = getchar();
c=c;
return 0;
}
void *Producter(void *arg)
{
int Item = 'a';
int print_cnt = 100000;
while(print_cnt--)
{
if(Item > 'z')
{
IntQueue.push('n');
Item = 'a';
}
IntQueue.push(Item++);
usleep(200000);
}
return NULL;
}
void *Consumer(void *arg)
{
int RetItem;
while(1)
{
IntQueue.pop(RetItem);
printf("%c",RetItem);
}
return NULL;
}
程序我运行了一下,结果没有出现什么问题.
但是还是要请教:
(1)我的同步方法有没有什么我没想到的问题?
(2)printf();函数并不能实时打印的字符,我用sync()和fflush()都没有能同步打印,请教一下有没有好的方法
|
(2) 试试 fprintf(stderr,...)
|
fflush(stdout);
这样应该可以呀
这样应该可以呀
|
又是行缓冲问题, printf后面加个n.