linux c 多线程 生产者--消费者2

实在不好意思,第一个版本有些问题,是局部变量和堆里面变量的区别。今天做了一下修改。代码如下。

#ifndef _LIST_H_

#define _LIST_H_

#include

#include

#include

struct List

{

char * buffer;

char * cursor;

char * begin;

char * end;

};

// you must add struct, otherwise it will prompt "expected ‘)’ before ‘*’ token"

void init(struct List * p_list);

int get_buffer_length (struct List * p_list);

void put_into_buffer(struct List* p_list,char *pc_char);

char get_from_buffer(struct List* p_list);

#endif

主要是更改了结构体List的定义,buffer必须定义为堆里面的变量。

#include "list.h"

void init(struct List * p_list){

char *temp=(char *)malloc(10);

memset(temp,'\0',10);

p_list->buffer=temp;

p_list->cursor=(p_list->buffer)+10;

p_list->begin=p_list->buffer;

p_list->end=(p_list->buffer)+10;

}

int get_buffer_length(struct List * p_list){

return p_list->end-p_list->cursor;

}

void put_into_buffer(struct List * p_list,char * pc_char){

printf("put ........ %c\n",*pc_char);

if(p_list->cursor<=p_list->begin||p_list->cursor>p_list->end)

printf(" put error\n");

//put the char into cursor's former place

(p_list->cursor)--;

memset(p_list->cursor,(int)(*pc_char),1);

}

char get_from_buffer(struct List * p_list){

if(p_list->cursorbegin||p_list->cursor>p_list->end)

printf(" get error\n");

int length=get_buffer_length(p_list);

printf("list length now is %d\n",length);

(p_list->cursor)++;

char result=*(p_list->end-1);

printf("get ------------------- %c\n",result);

if(length==1)

{

return result;

}

else

{

char *temp=(char *)malloc(10);

bcopy(p_list->cursor-1,temp+10-length+1,length-1);

free(p_list->buffer);

p_list->buffer=temp;

p_list->begin=temp;

p_list->end=temp+10;

p_list->cursor=p_list->end-length+1;

}

return 0;

}

#include

#include

#include

#include

#include "List.h"

pthread_cond_t has_product = PTHREAD_COND_INITIALIZER;

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;

//define the Producer thread

void * produce(void * arg)

{

//arg is a char * pointer

struct List * p_list=(struct List *)arg;

//if buffer length =10,than wait,because buffer is full,

while(1)

{

pthread_mutex_lock(&lock); //正确位置,

//printf("111111\n");

if(get_buffer_length(p_list)==10)

{

//printf("22222222\n");

int num1=pthread_cond_wait(&has_product, &lock);

//printf("33333333\n");

//printf(" num11111 %d\n",num1);

}

//buffer'length !=10,not full, we can put char into buffer.

//printf("444444\n");

//pthread_mutex_lock(&lock); //错误位置

//printf("555555\n");

char zifu=(char)(1+(int)(128.0*rand()/(RAND_MAX+1.0)));

put_into_buffer(p_list,&zifu);

//after put, if the length>0,we can notify the wait thread,means that you can get char now

if(get_buffer_length(p_list)==1)

{

pthread_cond_signal(&has_product);

//printf("66666\n");

}

//printf("777777777777\n");

int num3=pthread_mutex_unlock(&lock);

//printf("unlocknumber 1111111111111 is %d\n",num3);

//printf("888888888888\n");

sleep(1);

//printf("99999999\n");

}

}

//define the second thread

void * comsume(void * arg)

{

//arg is a char * pointer

struct List * p_list=(struct List *)arg;

while(1)

{

//if buffer length =10,than wait,because buffer is full,

pthread_mutex_lock(&lock); //正确位置,

//printf("aaaaaaaaaa\n");

if(get_buffer_length(p_list)==0)

{

//printf("bbbbbbbbbbbbbb\n");

int num2=pthread_cond_wait(&has_product, &lock);

//printf("cccccccccccc\n");

//printf(" num2222 %d\n",num2);

}

//buffer'length !=0,not full, we can get char into buffer.

//printf("dddddddddddddddd\n");

//int num4=pthread_mutex_lock(&lock); //错误位置

//printf("unlocknumber 222222222 is %d\n",num4);

//printf("eeeeeeeeeeeeee\n");

char zifu=get_from_buffer(p_list);

//after get, if the length<10,we can notify the put thread,means that you can put now!

if(get_buffer_length(p_list)<10)

{

pthread_cond_signal(&has_product);

}

//printf("ffffffffffff\n");

pthread_mutex_unlock(&lock);

//printf("gggggggggggg\n");

sleep(2);

// printf("hhhhhhhhhhhhhh\n");

}

}

int main (int argc, char ** argv)

{

pthread_t tidA, tidB;

struct List common;

init(&common);

pthread_create(&tidB, NULL, &comsume, &common);

sleep(3);

pthread_create(&tidA, NULL, &produce, &common);

sleep(120);

return 0;

}

linux多线程 消费者,linux c 多线程 生产者-消费者二相关推荐

  1. Java多线程之线程通信之生产者消费者阻塞队列版

    Java多线程之线程通信之生产者消费者传统版和阻塞队列版 目录 线程通信之生产者消费者传统版 线程通信之生产者消费者阻塞队列版 1. 线程通信之生产者消费者传统版 题目: 一个初始值为零的变量,两个线 ...

  2. 多生产者_多线程必考的「生产者 - 消费者」模型,看齐姐这篇文章就够了

    生产者 - 消费者模型 Producer-consumer problem 是一个非常经典的多线程并发协作的模型,在分布式系统里非常常见.也是面试中无论中美大厂都非常爱考的一个问题,对应届生问的要少一 ...

  3. java 生产者消费者_Java多线程:线程间通信—生产者消费者模型

    一.背景 && 定义 多线程环境下,只要有并发问题,就要保证数据的安全性,一般指的是通过 synchronized 来进行同步. 另一个问题是, 多个线程之间如何协作呢 ? 我们看一个 ...

  4. java多线程并发之旅-09-java 生产者消费者 Producer/Consumer 模式

    生产者消费者模式 在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个模块来负责处理(此处的模块是广义的,可以是类.函数.线程.进程等).产生数据的模块,就形象地称为生产 ...

  5. Linux 实验:记录型信号量 生产者-消费者问题详解

    进程同步问题是一个非常重要且相当有趣的问题,因而吸引了很多学者对他进行研究.本文就选取其中较为代表性的生产者-消费者问题来进行学习,以帮助我们更好的理解进程同步的概念及实现方法. 一.问题描述 有一群 ...

  6. Java多线程(实现多线程、线程同步、生产者消费者)

    1.实现多线程 1.1简单了解多线程[理解] 是指从软件或者硬件上实现多个线程并发执行的技术. 具有多线程能力的计算机因有硬件支持而能够在同一时间执行多个线程,提升性能. 1.2并发和并行[理解] 并 ...

  7. JAVA入门基础进阶(十四)—— 实现多线程、线程同步、生产者消费者

    文章目录 1.实现多线程 1.1简单了解多线程[理解] 1.2并发和并行[理解] 1.3进程和线程[理解] 1.4实现多线程方式一:继承Thread类[应用] 1.5实现多线程方式二:实现Runnab ...

  8. Java学习笔记18:Java_Map集合_HashMap集合_可变参数_Stream流_多线程_线程同步_生产者消费者

    文章目录 1.Map集合 1.1Map集合概述和特点[理解] 1.2Map集合的基本功能[应用] 1.3Map集合的获取功能[应用] 1.4Map集合的遍历(方式1)[应用] 1.5Map集合的遍历( ...

  9. 多线程必考的「生产者 - 消费者」模型,看乔戈里这篇文章就够了

    这里是<壹齐学多线程>系列的第 3 篇 生产者 - 消费者模型 Producer-consumer problem 是一个非常经典的多线程并发协作的模型,在分布式系统里非常常见.也是面试中 ...

  10. 多线程并发如何高效实现生产者/消费者?

    [导读]无需引入第三方消息队列组件,我们如何利用内置C#语法高效实现生产者/消费者对数据进行处理呢? 在.NET Core共享框架(Share Framework)引入了通道(Channel),也就是 ...

最新文章

  1. ListView的操作模式的选择的更详细的解释CHOICE_MODE_MULTIPLE与CHOICE_MODE_MULTIPLE_MODAL...
  2. HDU 5119 Happy Matt Friends(递推)
  3. 在SIMULINK实现各类优化类算法的仿真——粒子群算法、细菌觅食、
  4. 课程范例 20150916html1 练习
  5. matlab中“存储空间不足,无法处理此命令”
  6. python-while循环-基本格式
  7. 【系统架构设计师】软考高级职称,一次通过,倾尽所有,看完这篇就够了,论软件架构设计的重要性、本篇论文“未通过考试”,供分析参考
  8. 几行代码理解Python变量访问的LEGB顺序
  9. PHP字符编码绕过漏洞总结
  10. python进行数据可视化时,中文是方块显示
  11. jQuery周日历选择器代码
  12. 学习备忘英语单词转载
  13. myeclipse部署多个应用到不同的weblogic domain中
  14. LeetCode : 390. 消除游戏(Elimination Game)分析和解答
  15. OpenCV—python 角点特征检测之一(cornerHarris、Shi-Tomasi、FAST)
  16. Jetson nano使用anaconda 2021-5-15
  17. 如何光明正大地学习KISS?当然是用这个DL接吻检测器了
  18. 数字签名与数字信封流程
  19. 品牌与Logo有什么区别?进来了解下
  20. python第6-7轮作业--字符串,模块

热门文章

  1. MySQL索引背后的数据结构及算法原理zz
  2. Luogu2295 MICE
  3. JBoss 系列五十:使用Apache httpd(mod_jk)和JBoss构架高可用集群环境
  4. 个人作业——软件产品分析
  5. iOS开发事件分发机制—响应链—手势影响
  6. python练习--模拟grep -B功能
  7. LINUN 网络连接小记
  8. Android Application 对象介绍
  9. jQuery 9 相对选择器
  10. 两数相乘结果溢出的判断