91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Perl線程生命周期的示例分析

發布時間:2021-12-06 10:41:45 來源:億速云 閱讀:155 作者:小新 欄目:開發技術

小編給大家分享一下Perl線程生命周期的示例分析,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

共享與同步

threads::shared

和現有大多數Perl線程模型不同,在PerlithreadsPerl線程模型中,默認情況下任何數據結構都不是共享的。當一個新Perl線程被創建以后,它就已經包含了當前所有數據結構的一份私有拷貝,新建Perl線程中對這份拷貝的數據結構的任何操作都不會在其他Perl線程中有效。因此,如果需要使用任何共享的數據,都必須顯式地申明。threads::shared包可以用來實現Perl線程間共享數據的目的。

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


清單10.Perl線程中的鎖機制    

usethreads::shared;   #inthread1  {  lock($share);#lockfor3seconds  sleep(3);#otherthreadscannotlockagain  }  #unlockimplicitlynowaftertheblock   #inthread2  {  lock($share);#willbeblocked,asalreadylockedbythread1  $share++;#afterthread1quitfromtheblock  }  #unlockimplicitlynowaftertheblock

上面的示例中,我們在thread1中使用lock方法鎖住了一個普通的標量,這會導致thread2在試圖獲取$share變量的鎖時被阻塞,當thread1從調用lock的代碼塊中退出時,鎖被隱式地釋放,從而thread2阻塞結束,lock成功以后,thread2才可以執行$share++的操作。對于數組和哈希表來說,lock必須用在整個數據結構上,而不是用在數組或哈希表的某一個元素上。

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

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

usethreads;  usethreads::shared;  #inthread1  {  lock($a);#lockfor3seconds  sleep(3);#otherthreadscannotlockagain  lock($b);#deadlockhere  }   #inthread2  {  lock($b);#willbeblocked,asalreadylockedbythread1  sleep(3);#afterthread1quitfromtheblock  lock($a);#deadlockhere  }

死鎖常常是多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操作時信號量的變化。

Perl線程隊列

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

其他有用的非核心包

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

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

看完了這篇文章,相信你對“Perl線程生命周期的示例分析”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

禹州市| 灌阳县| 天水市| 宜城市| 武功县| 繁峙县| 商城县| 闽侯县| 库车县| 西安市| 年辖:市辖区| 秦皇岛市| 苏尼特左旗| 通许县| 措勤县| 大渡口区| 大洼县| 榆林市| 郧西县| 闻喜县| 綦江县| 永胜县| 宁武县| 新建县| 延津县| 平江县| 定结县| 陇西县| 甘孜县| 大厂| 大理市| 康马县| 资讯| 集贤县| 怀化市| 台湾省| 弋阳县| 芮城县| 商都县| 栾城县| 会东县|