- 浏览: 153051 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lanhaitun1991:
亲,其实你这里介绍的方法有一个最大的问题:如果放入队列之后,但 ...
分布式事务 -
lp385267935:
不错 很好用~3Q
jsonlib json-->object,忽略object中没有的属性 -
xiebo1983:
http://www.sqkoo.com/show/detai ...
mysql latin1乱码 -
envy2002:
当然可以了,tomcat中源码你可以看看,只要“欺骗”过去to ...
tomcat中的长连接 -
newSaa:
问一下,可以在 tomcat 建立tcp 长连接吗?
tomcat中的长连接
实在不好意思,第一个版本有些问题,是局部变量和堆里面变量的区别。今天做了一下修改。代码如下。
#ifndef _LIST_H_ #define _LIST_H_ #include <string.h> #include <stdio.h> #include <stdlib.h> 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->cursor<p_list->begin||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 <pthread.h>
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #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; }
发表评论
-
tomcat停止
2012-04-18 12:50 0#!/bin/sh #kill tomcat pid ... -
ubuntu 装mysql
2012-04-12 13:37 770最近项目好急,没时间整理,特做以下记录 去mysql网 ... -
red hat 安装svn
2012-03-23 16:34 1336素材: httpd-2.2.22.tar subve ... -
linux 当前shell指定java版本
2012-02-16 09:41 2917装了red hat 5.4,系统默认自带了Java 1.4, ... -
U盘安装red hat.
2012-02-09 10:50 1044没有DVD光盘和DVD光驱,悲剧啊,还好,网上有工具。 ... -
linux 下samba使用简介
2011-12-06 16:46 1115今天装了一台真正的linux主机(red hat),呵呵。安装 ... -
Shell学习
2011-11-30 17:32 759类unix操作系统中有b shell, k shell, c ... -
gdb调试linux0.11内核。
2011-11-26 16:13 15911. 下载bochs源码,配置,编译。 ./con ... -
red hat的远程桌面 xmanager
2011-11-04 14:49 3034用virtualbox装好red hat之后,我们可 ... -
virtual box中安装red hat并实现 ftp功能
2011-11-03 15:49 1747由于在公司上网,公司有个防火墙,安装虚拟主机需要虚 ... -
bochs调试linux 0.11内核
2011-07-01 15:24 6780学习操作系统,最难的就是 ... -
关于linux程序在内存中的分布管理
2011-05-27 10:54 1711这段时间,一直在看汇编,想学习一下li ... -
solaris mount细节
2011-04-11 14:33 10091. 首先确保 nfs server ... -
linux file open的实质
2011-03-30 17:36 2078linux open file的时候到底做了什么呢 ... -
linux-gcc 编译时头文件和库文件搜索路径(转)
2011-03-11 11:16 1716一、头文件 gcc 在编译时寻找所需要的头文件 : ※ ... -
linux extern关键字的作用2
2011-03-09 17:13 1500extern int O_RDONLY; #includ ... -
GCC 参数详解(转载)
2011-03-01 10:29 1140gcc and g++分别是gnu的c &am ... -
linux extern关键字的作用
2011-02-25 17:28 2936extern 的作用是起到一个 ... -
linux 可执行文件依赖库查看
2011-02-25 12:24 5678在多线程编程中,我们用gcc -Wall -g ... -
c语言编译全过程(转)
2011-02-25 10:46 1221C语言编译全 ...
相关推荐
以生产者/消费者问题为例来阐述Linux线程的控制和通信。一组生产者线程与一组消费者线程通过缓冲区发生联系。生产者线程将生产的产品送入缓冲区,消费者线程则从中取出产品。缓冲区有N 个,是一个环形的缓冲池。 ...
设计要求:(1)每个生产者和消费者对有界缓冲区进行操作后,即时显示有界缓冲区的全部内容,当前指针位置和生产者/消费者线程的标识符.(2)生产者和消费者各有两个以上.(3)多个生产者或多个消费者之间须有共享对缓冲区...
使用多线程程序模拟实现单生产者/多消费者问题。 要求“生产者”随机产生一个整数,“消费者 1”将这个整数加 1 后输出,“消 费者 2”将这个整数加 2 后输出,“消费者 3”将这个整数加 3 后输出,“消 费者 4”将...
以下是对"Linux C"环境下,利用多进程或多线程实现生产者/消费者问题的详细解释: 首先,我们需要了解基础概念: 1. **多进程**:在Linux系统中,每个进程都有自己的独立内存空间,它们之间的通信通常通过文件、...
在这个"Linux下多线程模拟实验"中,我们将深入探讨如何使用C语言在Linux环境下实现生产者-消费者问题,这是一个经典的线程同步问题。 生产者-消费者问题是多线程编程中的一个经典案例,主要用于演示如何通过共享...
针对生产者-消费者问题,多线程同步方法提供了一种有效且可靠的解决方案。在本课程设计中,采用的是Linux环境下的C语言编程,利用了信号量(Semaphore)和互斥锁(Mutex)来实现线程间的同步和互斥访问。 - **信号...
通过对生产者-消费者模型的实现,学生将学习如何在Linux环境下运用无名信号量来保护临界资源,同时提升对文件I/O操作的掌握。 二、实验内容 实验分为三个部分: 1. 使用链式结构创建10个子进程,形成进程链。 2. ...
(Linux C)利用多进程或多线程模拟实现生产者/消费者问题。
- GCC编译器是Linux下的标准C编译器,能支持C语言和C++,可以用来编译和链接生产者-消费者模型的代码。 - VI编辑器是Linux下的文本编辑器,用于编写源代码。 3. **C语言实现**: - C语言是底层编程的语言,适合...
生产者消费者模型是一种经典的多线程同步问题,广泛应用于计算机科学和操作系统领域。在Linux环境中,这个模型通过信号量机制和缓冲区来实现线程间的通信和资源管理。以下是关于这个主题的详细解释: 1. **生产者...
此实例在windows 10系统上可以成功运行,可以修改一下,在linux上也可以运行,思路都是一样的。 说明:这个是个图书馆案例,默认100个座位,生产者与消费者各2个线程 (修改:加锁)
在Linux下完整C语言实现生产者消费者问题的代码。其中涉及信号量、多线程、GCC编译、PV操作等基础知识。Linux下通过gcc - o yy xxx.c -pthread,再通过./yy即可运行。
5. **多线程**:为了模拟生产者和消费者的行为,代码可能创建了两个或多个线程,一个代表生产者,一个代表消费者。每个线程都有自己的逻辑,按照预定的规则与缓冲区交互。 运行说明.txt文件可能包含了如何编译和...
本文将深入探讨如何在Linux上使用C语言或C++实现多线程的生产者消费者模式。 首先,我们需要理解生产者消费者模型的基本概念。生产者是产生数据的一方,而消费者则是消耗这些数据的一方。在这个模型中,通常有一个...
Linux课程设计中的“消费者-生产者问题”是一个经典的多线程同步问题,源自计算机科学的并发控制领域。这个问题由Edsger Dijkstra在1965年提出,它模拟了一个系统,其中生产者生成资源而消费者消耗这些资源,两者都...
在Linux环境下,使用C语言实现这样的程序通常涉及到多线程、同步原语和共享内存等概念。本文将详细讲解如何利用C语言在Linux下构建一个简单的生产者-消费者模型。 首先,我们需要理解基本的结构。生产者-消费者模型...
本实验使用多线程同步方法解决生产者消费者问题,主要涉及的技术点包括: - **互斥锁(Mutex Locks)**:用于实现对缓冲区的互斥访问,确保同一时间只有一个线程能够修改缓冲区状态。 - **信号量(Semaphores)**:...
操作系统中的生产者-消费者问题是一个经典的多线程同步问题,源于1965年由Edsger Dijkstra提出的银行家算法。这个问题的设定是有一个共享资源(例如一个缓冲区),生产者线程负责生成数据并放入缓冲区,而消费者线程...
C语言实现生产者消费者问题,分配具有n个缓冲区的缓冲池,作为共享资源。 定义两个资源型信号量empty 和full,empty信号量表示当前空的缓冲区数量,full表示当前满的缓冲区数量。 定义互斥信号量mutex,当某个进程...
生产者-消费者问题是多线程和进程同步的经典案例。在这个问题中,生产者进程负责生成产品并放入一个有限大小的缓冲区,而消费者进程则负责从缓冲区取出并消费产品。问题的核心是如何保证缓冲区不被填满(防止生产过...