Perl线程队列和信号量概念解析

本文和大家重点学习一下Perl线程的相关知识,主要包括信号量,Perl线程队列,其他有用的非核心包等内容,希望通过本文的学习你对Perl线程的概念有新的认识。

信号量

Thread::Semaphore包为Perl线程提供了信号量的支持。你可以创建一个自己的信号量,并通过down操作和up操作来实现对资源的同步访问。实际上,down操作和up操作对应的就是我们所熟知的P操作和V操作。从内部实现上看,Thread::Semaphore本质上就是加了锁的共享变量,无非是把这个加了锁的共享变量封装成了一个Perl线程安全的包而已。由于信号量不必与任何变量绑定,因此,它非常灵活,可以用来控制你想同步的任何数据结构和程序行为。例如

清单13.Perl线程中的信号量

usethreads;  


usethreads::shared;  


useThread::Semaphore;  


 



my$s=Thread::Semaphore->new();  




$s->down();#Poperation  



...  



$s->up();#Voperation  



 

从本质上说,信号量是一个共享的整型变量的引用。默认情况下,它的初始值为1,down操作使它的值减1,up操作使它的值加1。当然,你也可以自定义信号量初始值和每次up或down操作时信号量的变化。例如

清单14.Perl线程中的信号量

usethreads;  


useThread::Semaphore;  


 



my$s=Thread::Semaphore->new(5);  




printf("s=".${$s}."\n");#s=5 




$s->down(3);  




printf("s=".${$s}."\n");#s=2 



...  



$s->up(4);  




printf("s=".${$s}."\n");#s=6 



 

Perl线程队列

Thread::Queue包为Perl线程提供了Perl线程安全的队列支持。与信号量类似,从内部实现上看,Thread::Queue也是把一个通过锁机制实现同步访问的共享队列封装成了一个Perl线程安全的包,并提供统一的使用接口。Thread::Queue在某些情况下可以大大简化Perl线程间通信的难度和成本。例如在生产者-消费者模型中,生产者可以不断地在Perl线程队列上做enqueue操作,而消费者只需要不断地在Perl线程队列上做dequeue操作,这就很简单地实现了生产者和消费者之间同步的问题。
例如

清单15.生产者-消费者模型中对Perl线程队列的使用

#!/usr/bin/perl  


#  


usethreads;  


useThread::Queue;  



my$q=Thread::Queue->new();  



 


subproduce{  



my$name=shift;  



while(1){  



my$r=int(rand(100));  




$q->enqueue($r);  



printf("$nameproduce$r\n");  


sleep(int(rand(3)));  


}  


}  


subconsume{  



my$name=shift;  




while(my$r=$q->dequeue()){  



printf("consume$r\n");  


}  


}  


 



my$producer1=threads->create(\&produce,"producer1");  




my$producer2=threads->create(\&produce,"producer2");  




my$consumer1=threads->create(\&consume,"consumer2");  




$producer1->join();  




$producer2->join();  




$consumer1->join();  



 

其他有用的非核心包

相关推荐