自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

深入剖析Perl線程的生命周期

開發(fā) 架構(gòu)
本文向大家介紹一下Perl線程的生命周期概念,和現(xiàn)有大多數(shù)Perl線程模型不同,在PerlithreadsPerl線程模型中,默認(rèn)情況下任何數(shù)據(jù)結(jié)構(gòu)都不是共享的。

本文和大家繼續(xù)討論一下Perl線程的生命周期,主要包括共享與同步,鎖,信號(hào)量和Perl線程隊(duì)列幾部分內(nèi)容,相信通過本文的學(xué)習(xí)你對(duì)Perl線程生命周期的概念有一定的了解。

共享與同步

threads::shared

和現(xiàn)有大多數(shù)Perl線程模型不同,在PerlithreadsPerl線程模型中,默認(rèn)情況下任何數(shù)據(jù)結(jié)構(gòu)都不是共享的。當(dāng)一個(gè)新Perl線程被創(chuàng)建以后,它就已經(jīng)包含了當(dāng)前所有數(shù)據(jù)結(jié)構(gòu)的一份私有拷貝,新建Perl線程中對(duì)這份拷貝的數(shù)據(jù)結(jié)構(gòu)的任何操作都不會(huì)在其他Perl線程中有效。因此,如果需要使用任何共享的數(shù)據(jù),都必須顯式地申明。threads::shared包可以用來實(shí)現(xiàn)Perl線程間共享數(shù)據(jù)的目的。

多Perl線程間既然有了共享的數(shù)據(jù),那么就必須對(duì)共享數(shù)據(jù)進(jìn)行小心地訪問,否則,沖突在所難免。PerlithreadsPerl線程模型中內(nèi)置的lock方法實(shí)現(xiàn)了Perl線程間共享數(shù)據(jù)的鎖機(jī)制。有趣的是,并不存在一個(gè)unlock方法用來顯式地解鎖,鎖的生命周期以代碼塊為單位,也就是說,當(dāng)lock操作所在的代碼塊執(zhí)行結(jié)束之后,也就是鎖被隱式釋放之時(shí)。例如


清單10.Perl線程中的鎖機(jī)制    
 

  1. usethreads::shared;  
  2.  
  3. #inthread1  
  4. {  
  5. lock($share);#lockfor3seconds  
  6. sleep(3);#otherthreadscannotlockagain  
  7. }  
  8. #unlockimplicitlynowaftertheblock  
  9.  
  10. #inthread2  
  11. {  
  12. lock($share);#willbeblocked,asalreadylockedbythread1  
  13. $share++;#afterthread1quitfromtheblock  
  14. }  
  15. #unlockimplicitlynowaftertheblock  
  16.  

 上面的示例中,我們?cè)趖hread1中使用lock方法鎖住了一個(gè)普通的標(biāo)量,這會(huì)導(dǎo)致thread2在試圖獲取$share變量的鎖時(shí)被阻塞,當(dāng)thread1從調(diào)用lock的代碼塊中退出時(shí),鎖被隱式地釋放,從而thread2阻塞結(jié)束,lock成功以后,thread2才可以執(zhí)行$share++的操作。對(duì)于數(shù)組和哈希表來說,lock必須用在整個(gè)數(shù)據(jù)結(jié)構(gòu)上,而不是用在數(shù)組或哈希表的某一個(gè)元素上。

假如一個(gè)Perl線程對(duì)某一個(gè)共享變量實(shí)施了鎖操作,在它沒有釋放鎖之前,如果另外一個(gè)Perl線程也對(duì)這個(gè)共享變量實(shí)施鎖操作,那么這個(gè)Perl線程就會(huì)被阻塞,阻塞不會(huì)被自動(dòng)中止而是直到前一個(gè)Perl線程將鎖釋放為止。這樣的模式就帶來了我們常見的死鎖問題。

例如
清單12.Perl線程中的死鎖    
 

  1. usethreads;  
  2. usethreads::shared;  
  3. #inthread1  
  4. {  
  5. lock($a);#lockfor3seconds  
  6. sleep(3);#otherthreadscannotlockagain  
  7. lock($b);#deadlockhere  
  8. }  
  9.  
  10. #inthread2  
  11. {  
  12. lock($b);#willbeblocked,asalreadylockedbythread1  
  13. sleep(3);#afterthread1quitfromtheblock  
  14. lock($a);#deadlockhere  
  15. }  
  16.  

 死鎖常常是多Perl線程程序中最隱蔽的問題,往往難以發(fā)現(xiàn)與調(diào)試,也增加了排查問題的難度。為了避免在程序中死鎖的問題,在程序中我們應(yīng)該盡量避免同時(shí)獲取多個(gè)共享變量的鎖,如果無法避免,那么一是要盡量使用相同的順序來獲取多個(gè)共享變量的鎖,另外也要盡可能地細(xì)化上鎖的粒度,減少上鎖的時(shí)間。#p#

信號(hào)量

Thread::Semaphore包為Perl線程提供了信號(hào)量的支持。你可以創(chuàng)建一個(gè)自己的信號(hào)量,并通過down操作和up操作來實(shí)現(xiàn)對(duì)資源的同步訪問。實(shí)際上,down操作和up操作對(duì)應(yīng)的就是我們所熟知的P操作和V操作。從內(nèi)部實(shí)現(xiàn)上看,Thread::Semaphore本質(zhì)上就是加了鎖的共享變量,無非是把這個(gè)加了鎖的共享變量封裝成了一個(gè)Perl線程安全的包而已。由于信號(hào)量不必與任何變量綁定,因此,它非常靈活,可以用來控制你想同步的任何數(shù)據(jù)結(jié)構(gòu)和程序行為。例如

清單13.Perl線程中的信號(hào)量    
 

  1. usethreads;  
  2. usethreads::shared;  
  3. useThread::Semaphore;  
  4.  
  5. my$s=Thread::Semaphore->new();  
  6. $s->down();#Poperation  
  7. ...  
  8. $s->up();#Voperation  
  9.  

 從本質(zhì)上說,信號(hào)量是一個(gè)共享的整型變量的引用。默認(rèn)情況下,它的初始值為1,down操作使它的值減1,up操作使它的值加1。當(dāng)然,你也可以自定義信號(hào)量初始值和每次up或down操作時(shí)信號(hào)量的變化。

Perl線程隊(duì)列

Thread::Queue包為Perl線程提供了Perl線程安全的隊(duì)列支持。與信號(hào)量類似,從內(nèi)部實(shí)現(xiàn)上看,Thread::Queue也是把一個(gè)通過鎖機(jī)制實(shí)現(xiàn)同步訪問的共享隊(duì)列封裝成了一個(gè)Perl線程安全的包,并提供統(tǒng)一的使用接口。Thread::Queue在某些情況下可以大大簡(jiǎn)化Perl線程間通信的難度和成本。例如在生產(chǎn)者-消費(fèi)者模型中,生產(chǎn)者可以不斷地在Perl線程隊(duì)列上做enqueue操作,而消費(fèi)者只需要不斷地在Perl線程隊(duì)列上做dequeue操作,這就很簡(jiǎn)單地實(shí)現(xiàn)了生產(chǎn)者和消費(fèi)者之間同步的問題。

其他有用的非核心包

本文前面討論的所有內(nèi)容都在Perl線程核心包的范疇之內(nèi)。其實(shí)CPAN上還有其他一些與Perl線程相關(guān)的非核心包,它們往往也會(huì)給Perl線程的使用帶來很大的便利,這里我們選出兩個(gè)稍加介紹,拋磚引玉。

Thread::Pool包允許你在程序中創(chuàng)建一批Perl線程去完成多個(gè)類似的任務(wù)。例如當(dāng)你希望創(chuàng)建一個(gè)多Perl線程程序去完成檢驗(yàn)1000個(gè)ip地址是否都能ping通的任務(wù)時(shí),Thread::Pool包可以給你帶來便利。
Thread::RWLock包為Perl線程中的讀寫操作提供了鎖機(jī)制的支持。例如當(dāng)你有多個(gè)reader和writerPerl線程共同訪問某一個(gè)或幾個(gè)文件時(shí),Thread::RWLock包可以給你帶來便利。

總結(jié)

本文主要介紹了Perl中Perl線程的使用方法,包括Perl線程的創(chuàng)建、執(zhí)行與消亡,如何在Perl線程中使用共享變量并通過鎖機(jī)制、信號(hào)量和Perl線程隊(duì)列的方法來實(shí)現(xiàn)Perl線程間的同步。PerlithreadsPerl線程模型與主流Perl線程模型***的不同之處在于默認(rèn)情況下任何數(shù)據(jù)結(jié)構(gòu)都是非共享的,或者說Perl中的ithreads是一個(gè)“非輕量級(jí)”的Perl線程模型。雖然這樣的Perl線程模型增加了程序的開銷,但它并不會(huì)在Perl線程的功能性上打折扣,同時(shí)它也使得Perl線程間的通訊和共享變得更加簡(jiǎn)單。這也符合了Perl一貫的簡(jiǎn)單而強(qiáng)大的理念和原則。

【編輯推薦】

  1. Perl線程的生命周期
  2. 追溯Perl線程的歷史
  3. Perl二維數(shù)組用法全程剖析
  4. 淺析Perl面向?qū)ο缶幊逃梅?/a>
  5. Perl正則表達(dá)式語(yǔ)法解析
責(zé)任編輯:佚名 來源: csdn.net
相關(guān)推薦

2010-07-14 10:48:37

Perl線程

2009-06-18 13:32:39

Java線程生命周期

2012-01-16 09:00:56

線程

2009-06-29 18:03:15

Java多線程線程的生命周期

2023-10-26 08:25:35

Java線程周期

2015-07-08 16:28:23

weak生命周期

2010-07-28 12:47:06

Flex組件

2022-04-19 07:20:24

軟件開發(fā)安全生命周期SSDLC應(yīng)用安全

2009-06-11 11:28:35

JSF生命周期

2021-08-24 07:53:28

AndroidActivity生命周期

2012-04-28 13:23:12

Java生命周期

2011-06-16 09:31:21

ActivityAndroid

2009-06-24 10:47:55

JSF生命周期

2012-06-20 10:29:16

敏捷開發(fā)

2013-08-19 17:03:00

.Net生命周期對(duì)象

2021-07-19 05:52:29

網(wǎng)絡(luò)生命周期網(wǎng)絡(luò)框架

2010-07-13 13:06:41

Perl面向?qū)ο?/a>

2020-03-30 13:20:58

線程Java編程語(yǔ)言

2015-07-09 15:42:48

ios應(yīng)用生命周期

2021-02-14 00:39:57

機(jī)器學(xué)習(xí)技術(shù)人工智能
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)