当前位置:  技术问答>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进行互斥

(一)队列头文件和源文件

#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.

    
 
 

您可能感兴趣的文章:

  • iptables规则问题,请大家帮忙看看怎么回事
  • 在编译内核时候出现问题,大家来帮忙看看是什么问题?怎么解决?
  • 关于全选的问题大家帮忙看看~
  • 大家去软件工程论坛里面去看看那,我发了700分的问题!!
  • redhat as3.0 java定时不能执行!请大家看看,问题在哪?
  • 虚心请教问题,帮我看看好吗?
  • 求人看看这个shell问题
  • 帮我看看我的sql语句写的有什么问题?
  • 关于arm交叉编译的问题,请帮忙看看问题出在什么地方?
  • 请帮我看看这个网络设置的问题
  • 大家帮我看看这个是什么问题
  • 大家能帮忙看看这个帖子的问题吗?
  • 看看这个代码问题在哪?
  • 帮忙看看下边代码有什么问题
  • 看看谁能解决这个问题?
  • 大家帮忙看看,是什么问题
  • 在浏览器里连接本机的菜鸟问题,帮忙看看!
  • 大侠帮忙看看,重定向问题
  • 关于用Jprint java打印的问题,请大家进来看看(路人甲、华仔哥)
  • 见不得人的问题,能帮我看看么
  • 生产者消费者问题--进程并发性体现得不太好,请帮我看看...
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 简单!看看这个方法!简单!看看这个方法!
  • linux高手看看
  • 好消息,近来看看......
  • 我想看看有关Linux和Unix的源码,有什么好的建议
  • 想看看linux的内核源代码!从哪里开始!给点建议!!
  • 我初学JAVA,大家愿意交朋友的进来看看!留QQ的给分啊!
  • jsp论坛,大家快去看看,解决树形目录http://52jsp.126.com
  • 各位大侠,小侠,快过来看看。
  • 看过操作系统设计与实现的进来看看
  • 请进来看看!!
  • 帮我看看下面这条语句??
  • 建议去这里看看,有好多基本的重要知识! 绝对值得一看!
  • 大家帮我看看,我好把贴子结了,里面有100分。。。。。。
  • 到 http://www.xbit2008.com 看看技术文章把! 我写的或从网上摘的!
  • 我刚申请的域名rootsafe.com大家看看怎么样? up有分!
  • 帮我看看是不是被黑了?
  • 我的Solaris启动不了了,请帮忙看看
  • 能不能帮我看看!!!!!
  • 请问哪位高手可以帮我远程看看Fedora的安装
  • 大神们帮我看看这个死机的原因


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3