- 浏览: 1488056 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (525)
- SEO (16)
- JAVA-EE-Hibernate (6)
- JAVA-EE-Struts (29)
- JAVA-EE-Spring (15)
- Linux (37)
- JAVA-SE (29)
- NetWork (1)
- CMS (14)
- Semantic Research (3)
- RIA-Flex (0)
- Ajax-Extjs (4)
- Ajax-Jquery (1)
- www.godaddy.com (0)
- SSH (34)
- JavaScript (6)
- SoftwareEngineer (9)
- CMMI (0)
- IDE-Myeclipse (3)
- PHP (1)
- Algorithm (3)
- C/C++ (18)
- Concept&Items (2)
- Useful WebSite (1)
- ApacheServer (2)
- CodeReading (1)
- Socket (2)
- UML (10)
- PowerDesigner (1)
- Repository (19)
- MySQL (3)
- SqlServer (0)
- Society (1)
- Tomcat (7)
- WebService (5)
- JBoss (1)
- FCKeditor (1)
- PS/DW/CD/FW (0)
- DesignPattern (11)
- WebSite_Security (1)
- WordPress (5)
- WebConstruction (3)
- XML|XSD (7)
- Android (0)
- Project-In-Action (9)
- DatabaseDesign (3)
- taglib (7)
- DIV+CSS (10)
- Silverlight (52)
- JSON (7)
- VC++ (8)
- C# (8)
- LINQ (1)
- WCF&SOA (5)
- .NET (20)
- SOA (1)
- Mashup (2)
- RegEx (6)
- Psychology (5)
- Stock (1)
- Google (2)
- Interview (4)
- HTML5 (1)
- Marketing (4)
- Vaadin (2)
- Agile (2)
- Apache-common (6)
- ANTLR (0)
- REST (1)
- HtmlAnalysis (18)
- csv-export (3)
- Nucth (3)
- Xpath (1)
- Velocity (6)
- ASP.NET (9)
- Product (2)
- CSS (1)
最新评论
-
lt26w:
理解成门面模式应该比较容易明白吧
FacadePattern-Java代码实例讲解 -
lt26w:
看下面的例子比较明白.
FacadePattern-Java代码实例讲解 -
javaloverkehui:
这也叫文档,别逗我行吗,也就自己看看。
HtmlCleaner API -
SE_XiaoFeng:
至少也应该写个注释吧。
HtmlCleaner API -
jfzshandong:
...
org.springframework.web.filter.CharacterEncodingFilter 配置
本例示范Linux信号量的基本用法。该范例使用了两个线程分别对一个公用队列进行入队和出队操作,并用信号量进行控制,当队列空时出队操作可以被阻塞,当队列满时入队操作可以被阻塞。
主要用到的信号量函数有:
sem_init:初始化信号量sem_t,初始化的时候可以指定信号量的初始值,以及是否可以在多进程间共享。
sem_wait:一直阻塞等待直到信号量>0。
sem_timedwait:阻塞等待若干时间直到信号量>0。
sem_post:使信号量加1。
sem_destroy:释放信号量。和sem_init对应。
关于各函数的具体参数请用man查看。如man sem_init可查看该函数的帮助。
//--------------------------msgdequeue.h开始------------------------------------- //实现可控队列 #ifndef MSGDEQUEUE_H #define MSGDEQUEUE_H #include "tmutex.h" #include <iostream> #include <errno.h> #include <time.h> #include <semaphore.h> #include <deque> using namespace std; template<typename T,typename MUTEX_TYPE = ThreadMutex> class CMessageDequeue ...{ public: CMessageDequeue(size_t MaxSize) : m_MaxSize( MaxSize ) ...{ sem_init( &m_enques,0, m_MaxSize ); //入队信号量初始化为MaxSize,最多可容纳MaxSize各元素 sem_init( &m_deques,0,0 ); //队列刚开始为空,出队信号量初始为0 } ~CMessageDequeue() ...{ sem_destroy(&m_enques); sem_destroy(&m_deques); } int sem_wait_i( sem_t *psem, int mswait ) ...{//等待信号量变成>0,mswait为等待时间,若mswait<0则无穷等待,否则等待若干mswait毫秒。 if( mswait < 0 ) ...{ int rv = 0; while( ((rv = sem_wait(psem) ) != 0 ) && (errno == EINTR ) ); //等待信号量,errno==EINTR屏蔽其他信号事件引起的等待中断 return rv; } else ...{ timespec ts; clock_gettime(CLOCK_REALTIME, &ts ); //获取当前时间 ts.tv_sec += (mswait / 1000 ); //加上等待时间的秒数 ts.tv_nsec += ( mswait % 1000 ) * 1000; //加上等待时间纳秒数 int rv = 0; while( ((rv=sem_timedwait( psem, &ts ))!=0) && (errno == EINTR) ); //等待信号量,errno==EINTR屏蔽其他信号事件引起的等待中断 return rv; } } bool push_back( const T &item, int mswait = -1 ) ...{ //等待mswait毫秒直到将item插入队列,mswait为-1则一直等待 if( -1 == sem_wait_i( &m_enques, mswait )) ...{ return false; } //AUTO_GUARD:定界加锁,见Linux多线程及临界区编程例解的tmutex.h文件定义。 AUTO_GUARD( g, MUTEX_TYPE, m_lock ); try ...{ m_data.push_back( item ); cout << "push " << item << endl; sem_post( &m_deques ); return true; } catch(...) ...{ return false; } } bool pop_front( T &item, bool bpop = true, int mswait = -1 ) ...{ //等待mswait毫秒直到从队列取出元素,mswait为-1则一直等待 if( -1 == sem_wait_i( &m_deques, mswait ) ) ...{ return false; } //AUTO_GUARD:定界加锁,见Linux多线程及临界区编程例解的tmutex.h文件定义。 AUTO_GUARD( g, MUTEX_TYPE, m_lock ); try ...{ item = m_data.front(); if( bpop ) ...{ m_data.pop_front(); cout << "pop " << item << endl; } sem_post( &m_enques ); return true; } catch(...) ...{ return false; } } inline size_t size() ...{ return m_data.size(); } private: MUTEX_TYPE m_lock; deque<T> m_data; size_t m_MaxSize; sem_t m_enques; sem_t m_deques; }; #endif //--------------------------msgdequeue.h结束------------------------------------- //--------------------------test.cpp开始------------------------------------- //主程序文件 #include "msgdequeue.h" #include <pthread.h> #include <iostream> using namespace std; CMessageDequeue<int> qq(5); void *get_thread(void *parg); void *put_thread(void *parg); void *get_thread(void *parg) ...{ while(true) ...{ int a = -1; if( !qq.pop_front( a,true, 1000 ) ) ...{ cout << "pop failed. size=" << qq.size() << endl; } } return NULL; } void *put_thread(void *parg) ...{ for(int i=1; i<=30; i++) ...{ qq.push_back( i, -1 ); } return NULL; } int main() ...{ pthread_t pget,pput; pthread_create( &pget,NULL,get_thread,NULL); pthread_create( &pput, NULL, put_thread,NULL); pthread_join( pget,NULL ); pthread_join( pput,NULL ); return 0; } //--------------------------test.cpp结束-------------------------------------
编译程序:g++ msgdequeue.h test.cpp -lpthread -lrt -o test
-lpthread链接pthread库。-ltr链接clock_gettime函数相关库。
编译后生成可执行文件test。输入./test执行程序。
线程get_thread每隔1000毫秒从队列取元素,线程put_thread将30个元素依次入队。两个线程模拟两条入队和出队的流水线。因我们在 CMessageDequeue<int> qq(5)处定义了队列最多可容纳5个元素,入队线程每入队到队列元素满5个后需阻塞等待出队线程将队列元素出队才能继续。测试时可调整队列可容纳最大元 素个数来观察运行效果。
发表评论
-
Linux内核源码包的安装及编译zz
2009-12-15 20:58 4266http://my.donews.com/ecco2005/2 ... -
Linux内核Makefile文件(二)
2009-12-15 19:34 2417=== 6 体系Makefile文 ... -
Linux内核Makefile文件(一)
2009-12-15 19:34 1834本文是/Documentation/kbuild/make ... -
Linux加载模块命令
2009-12-15 19:28 2678安装模块insmod *.ko卸载 ... -
linux内核模块编程
2009-12-15 19:25 3556主题: linux内核模块的程序结构--模块加载函数(必须), ... -
编译linux内核~
2009-12-05 22:04 1396小菜鸟第一次编译linux内核。截图太多 。。不方便上传 = ... -
grub2 基础教程
2009-12-05 18:01 2744grub2基础教程-修订版 ... -
Ubuntu9.10版本没有了menu.lst文件!
2009-12-05 18:00 3115囧~现在都在grub下面配置了。 不过麦斯之前的men ... -
关于信号量与线程互斥锁的区别与实现
2009-11-30 14:37 2390之前一直没有怎么 ... -
Linux信号量线程控制
2009-11-30 14:31 3654线程中互斥锁的使用,达到对共享资源互斥使用。除了使用互斥锁, ... -
信号量和自旋锁
2009-11-29 21:56 1626内核同步措施 ... -
Linux获取当前时间
2009-11-29 21:16 3637Linux获取当前时间 ... -
pthread库学习(2): 线程的同步,使用信号量
2009-11-29 20:55 2453先看下面这段程序,主线程创建了三个线程,每个线程中均有一个打印 ... -
信号量的基本思想
2009-11-29 20:17 1455信号量是1965荷兰Dijkstra 为了解决并发进程问题 ... -
多进程通信方式一:管道(PIPE)
2009-11-27 18:29 9074进程通信(IPC)的几种方式及比较 撰文:黄显国08 ... -
进程的管道通信
2009-11-27 18:12 2982实验四 进程的管道通信 ... -
Linux下线程的挂起和恢复
2009-11-27 15:42 3701POSIX的Linux操作系统没有提供线程挂起和恢复的例程,在 ... -
Linux 编程之生成静态连接库
2009-11-27 15:41 1387静态库及动态库的建立 ... -
LInux高级编程 - 线程(Threads)
2009-11-27 15:40 1855LInux高级编程 - 线程(Threads) ... -
Linux下c开发 之 线程通信
2009-11-27 15:39 19301.Linux“线程” 进程与 ...
相关推荐
关于linux c 开发中的信号量的使用,有详细的说明
使用信号量(Semaphore)实现线程的同步
linux信号量的源码例子 linux信号量的源码例子
主要介绍了JAVA 多线程之信号量(Semaphore)实例详解的相关资料,需要的朋友可以参考下
难堪的一次面试: 信号量Semaphore了解过吗?没有
这篇文章主要介绍了python线程信号量semaphore使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.semaphore信号量原理 多线程同时运行,能提高程序的...
信号量本质上是一个非负的整数计数器,它被用来控制对公共资源的访问。当公共资源增加时,调用函数sem_post()增加信号量。只有当信号量值大于0时,才能使用公共资源,使用后,函数sem_wait()减少信号量。函数...
mutex和semaphore互斥程序实例
信号量(Semaphore)哲学家进餐问题(the dining philosophers problem)---------------------------程序
主要介绍了Java 信号量Semaphore的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
资源包含了vxworks多任务(task和semaphore信号量及事件)的相关编程例子,通过创建多任务的简单例子,帮助大家了解taskSpawn函数、信号量semaphore、以及事件event的使用方法。
Semaphore Semaphore分为单值和多值两种,前者只能被一个线程获得,...单个信号量的Semaphore对象可以实现互斥锁的功能,并且可以是由一个线程获得了“锁”,再由另一个线程释放“锁”,这可应用于死锁恢复的一些场
Linux下多线程编程-Pthread与Semaphore的使用.doc
Linux中的semaphore和rwsem .pdf
信号量(Semaphore)是一种实现任务间通信的机制,可以实现任务之间同步或临界资源的互斥访问 (临界资源指同一时刻只能有有限个访问),常用于协助一组相互竞争的任务来访问临界资源。运行机制可以理解为:信号量是...
主要介绍了Java并发编程之Semaphore(信号量)详解及实例的相关资料,需要的朋友可以参考下
Semaphore是计数信号量。Semaphore管理一系列许可证。每个acquire方法阻塞,直到有一个许可证可以获得然后拿走一个许可证;每个release方法增加一个许可证,这可能会释放一个阻塞的acquire方法。然而,其实并没有...
关于Android变成中的信号量semaphore,在使用过程中我们往往搞不清楚其信号量的申请和使用。这里主要针对信号量初始值为零的情况做介绍,其他情况不做讨论。初始值为零的情况较少使用,部分代码中的这个情况往往让...
JAVA多线程--信号量(Semaphore)_.docx