关闭

Producer/Consumer Model(pthread)

485人阅读 评论(0) 收藏 举报

想用pthread做一个生产者/消费者的模型,这个事情想了很久了,一直都懒得动手,本以为很容易,写起来才知道,自己工作这几年,一直看代码,很少写代码,原来的技术功底就不怎么好,这下基本全废了~


先用pthread随便写了个代码:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include <pthread.h>

pthread_t producer_thread;
pthread_t consumer_thread;

void* producer_routine(void* parg);
void* consumer_routine(void* parg);

int main(int argc, char** argv)
{
    int result = 0;
    
    result = pthread_create(&consumer_thread, NULL, &consumer_routine, NULL);

    printf("result for creating consumer_thread is: %d\n", result);
    
    result = pthread_create(&producer_thread, NULL, &producer_routine, NULL);

    printf("result for creating producer_thread is: %d\n", result);
    
    return 0;
}

void* producer_routine(void* parg)
{
    while(1)
    {
        printf("i am producer thread~\n");


        sleep(2);
    }
}

void* consumer_routine(void* parg)
{
    while(1)
    {
        printf("i am consumer thread~\n");

        sleep(2);
    }
}

程序运行时发现,创建的两个线程,并不是像自己想象的那样,在不停的打印,而是只打印个一两次,甚至有时一次都不打印,程序就终止了,开始还以为系统有什么限制,导致进程被Kill,想来想去才发现,主线程运行结束退出,创建的这两个子线程也就Over了,因此修改了main函数:

int main(int argc, char** argv)
{
    int result = 0;
    
    result = pthread_create(&consumer_thread, NULL, &consumer_routine, NULL);

    printf("result for creating consumer_thread is: %d\n", result);
    
    result = pthread_create(&producer_thread, NULL, &producer_routine, NULL);

    printf("result for creating producer_thread is: %d\n", result);
    
    while(1);

    return 0;
}

加了个“while(1);”,这个功能虽然可以,但是毕竟看着太业余了,再修改一下:

int main(int argc, char** argv)
{
    int result = 0;
    
    result = pthread_create(&consumer_thread, NULL, &consumer_routine, NULL);

    printf("result for creating consumer_thread is: %d\n", result);
    
    result = pthread_create(&producer_thread, NULL, &producer_routine, NULL);

    printf("result for creating producer_thread is: %d\n", result);
    
    pthread_join(consumer_thread, NULL);
    pthread_join(producer_thread, NULL);


    return 0;
}

感觉这样才看着像那么回事~

明天的计划,用 Double Linked List的方式实现Producer/Consumer Model~



0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Java多线程:Producer-Consumer不同的几种实现方式

生产者消费者问题是一个典型的线程同步问题。 主要有如下实现方式: wait() notifyAll() class Queue { //共享队列的目的用于...
  • langjian2012
  • langjian2012
  • 2015-03-22 20:55
  • 1226

RocketMQ——客户端篇:Producer/Consumer的实例对象

调用MQClientInstance.start方法启动MQClientInstance对象;大致逻辑如下:1、检查MQClientInstance.ServiceState的状态(初始化状态为Ser...
  • meilong_whpu
  • meilong_whpu
  • 2017-08-09 09:08
  • 338

漫游Kafka设计篇之Producer和Consumer

负载均衡producer直接将数据发送到broker的leader(主节点),不需要在多个节点进行分发。为了帮助producer做到这点,所有的Kafka节点都可以及时的告知:哪些节点是活动的,目标t...
  • honglei915
  • honglei915
  • 2014-07-09 18:40
  • 18995

Java:多线程Producer-Consumer的多种实现

多线程Producer-Consumer的多种实现 更多类型Product-Consumer的实现:https://github.com/Al-assad/Produer-Consumer ...
  • Al_assad
  • Al_assad
  • 2016-11-01 09:22
  • 538

Kafka 学习笔记(九)producer 和 consumer分别在两个虚拟机上

这个才是Kafka真正要实现的功能嘛,有人生产消息,有人订阅消息然后生产者发送给订阅者,这个逻辑才对。我们先配置有traffic消息的虚拟机。我是通信的,Kafka我用来监听traffic,所以消息是...
  • chuliuxiangjiao
  • chuliuxiangjiao
  • 2015-07-20 01:04
  • 2136

kafka进击之路(五) ——producer API开发

kafka 0.8 kafka producer API开发
  • qq_35799003
  • qq_35799003
  • 2016-08-18 10:53
  • 3749

多线程的Producer/Consumer模式

Win32下多线程实现数据协同主要靠下面四种Synchronization Object: eventmutex or critical sectionsemaphorewaitable...
  • u010153703
  • u010153703
  • 2014-08-11 17:46
  • 865

KafkaConsumer一些概念解释(从官方文档整理而来)

自己整理的一些关于kafkaconsumer类的一些概念
  • lianjunzongsiling
  • lianjunzongsiling
  • 2016-09-22 14:41
  • 979

apache kafka系列之Producer处理逻辑

转载自同事写得一篇wiki博客 KafkaProducer产生数据发送给KafkaServer,具体的分发逻辑及负载均衡逻辑,全部由producer维护。 Kafka结构图 Kafk...
  • lizhitao
  • lizhitao
  • 2014-05-23 11:42
  • 5346

producer-consumer问题的分析和讨论

转载自:http://shmilyaw-hotmail-com.iteye.com/blog/1721530 问题描述      在学习多线程编程的时候,我们经...
  • lv18092081172
  • lv18092081172
  • 2016-06-26 22:38
  • 596
    个人资料
    • 访问:504412次
    • 积分:6804
    • 等级:
    • 排名:第3998名
    • 原创:297篇
    • 转载:7篇
    • 译文:2篇
    • 评论:53条
    最新评论