- 浏览: 153056 次
- 性别:
- 来自: 深圳
文章分类
最新评论
-
lanhaitun1991:
亲,其实你这里介绍的方法有一个最大的问题:如果放入队列之后,但 ...
分布式事务 -
lp385267935:
不错 很好用~3Q
jsonlib json-->object,忽略object中没有的属性 -
xiebo1983:
http://www.sqkoo.com/show/detai ...
mysql latin1乱码 -
envy2002:
当然可以了,tomcat中源码你可以看看,只要“欺骗”过去to ...
tomcat中的长连接 -
newSaa:
问一下,可以在 tomcat 建立tcp 长连接吗?
tomcat中的长连接
linux 线程同步机制和java的是极其类似的。如果不太明白java多线程编程,可以参考我原先写的java多线程编程。下面我们将展现linux下如何实现生产者和消费者模型。
直接上代码吧:
#ifndef _LIST_H_
#define _LIST_H_ #include <string.h> #include <stdio.h> struct List { char buffer[10]; 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,先进先出。
#include "list.h" void init(struct List * p_list){ memset(p_list->buffer,'\0',10); 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"); //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"); //put the char into cursor's former place char result=*(p_list->cursor); (p_list->cursor)++; printf("get ......... %c\n",result); return result; }
List的具体实现。
#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; }
这个是具体的模型实现,特别注意的是produce和consume方法里面,我注释了,加锁的正确位置和错误位置。如果加锁的位置在错误位置会引起死锁,具体方法,还是用“颜色”分析方法。
首先cosumer进行wait,使其在mutex上进入等待队列,线程切换到produce线程上面执行,然后produce释放锁,consumer居然又要lock mutex,所以互斥,consumer线程就死了,然后produce循环过来,也要lock mutex,所以produce线程也死了。就这样,正确lock mutex位置在文中进行了标注。
发表评论
-
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 1338素材: 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环境下运用无名信号量来保护临界资源,同时提升对文件I/O操作的掌握。 二、实验内容 实验分为三个部分: 1. 使用链式结构创建10个子进程,形成进程链。 2. ...
在这个"Linux下多线程模拟实验"中,我们将深入探讨如何使用C语言在Linux环境下实现生产者-消费者问题,这是一个经典的线程同步问题。 生产者-消费者问题是多线程编程中的一个经典案例,主要用于演示如何通过共享...
针对生产者-消费者问题,多线程同步方法提供了一种有效且可靠的解决方案。在本课程设计中,采用的是Linux环境下的C语言编程,利用了信号量(Semaphore)和互斥锁(Mutex)来实现线程间的同步和互斥访问。 - **信号...
以下是对"Linux C"环境下,利用多进程或多线程实现生产者/消费者问题的详细解释: 首先,我们需要了解基础概念: 1. **多进程**:在Linux系统中,每个进程都有自己的独立内存空间,它们之间的通信通常通过文件、...
- GCC编译器是Linux下的标准C编译器,能支持C语言和C++,可以用来编译和链接生产者-消费者模型的代码。 - VI编辑器是Linux下的文本编辑器,用于编写源代码。 3. **C语言实现**: - C语言是底层编程的语言,适合...
生产者消费者模型是一种经典的多线程同步问题,广泛应用于计算机科学和操作系统...以上是对"生产者消费者程序-Linux"的详细解析,通过理解并实践这个模型,你可以更好地掌握多线程同步、资源管理和并发编程的核心概念。
(Linux C)利用多进程或多线程模拟实现生产者/消费者问题。
在Linux下完整C语言实现生产者消费者问题的代码。其中涉及信号量、多线程、GCC编译、PV操作等基础知识。Linux下通过gcc - o yy xxx.c -pthread,再通过./yy即可运行。
5. **多线程**:为了模拟生产者和消费者的行为,代码可能创建了两个或多个线程,一个代表生产者,一个代表消费者。每个线程都有自己的逻辑,按照预定的规则与缓冲区交互。 运行说明.txt文件可能包含了如何编译和...
此实例在windows 10系统上可以成功运行,可以修改一下,在linux上也可以运行,思路都是一样的。 说明:这个是个图书馆案例,默认100个座位,生产者与消费者各2个线程 (修改:加锁)
Linux课程设计中的“消费者-生产者问题”是一个经典的多线程同步问题,源自计算机科学的并发控制领域。这个问题由Edsger Dijkstra在1965年提出,它模拟了一个系统,其中生产者生成资源而消费者消耗这些资源,两者都...
本文将深入探讨如何在Linux上使用C语言或C++实现多线程的生产者消费者模式。 首先,我们需要理解生产者消费者模型的基本概念。生产者是产生数据的一方,而消费者则是消耗这些数据的一方。在这个模型中,通常有一个...
在Linux环境下,使用C语言实现这样的程序通常涉及到多线程、同步原语和共享内存等概念。本文将详细讲解如何利用C语言在Linux下构建一个简单的生产者-消费者模型。 首先,我们需要理解基本的结构。生产者-消费者模型...
操作系统中的生产者-消费者问题是一个经典的多线程同步问题,源于1965年由Edsger Dijkstra提出的银行家算法。这个问题的设定是有一个共享资源(例如一个缓冲区),生产者线程负责生成数据并放入缓冲区,而消费者线程...
C语言实现生产者消费者问题,分配具有n个缓冲区的缓冲池,作为共享资源。 定义两个资源型信号量empty 和full,empty信号量表示当前空的缓冲区数量,full表示当前满的缓冲区数量。 定义互斥信号量mutex,当某个进程...
生产者-消费者问题是多线程和进程同步的经典案例。在这个问题中,生产者进程负责生成产品并放入一个有限大小的缓冲区,而消费者进程则负责从缓冲区取出并消费产品。问题的核心是如何保证缓冲区不被填满(防止生产过...
例如,可以使用Pthreads库在Linux环境下编写多线程程序,实现生产者和消费者线程,并使用互斥锁和条件变量来同步它们的行为。 最后,值得注意的是,在编写涉及多进程或线程的程序时,代码必须仔细设计以确保线程...