執行緒是乙個好東西,他不象程序占用那麼多的記憶體,因不他不需要主空間,不需要程序控制塊。他只共享所有主程序的所有內容。所以今天我們來研究一下執行緒的特點之一,共享的變數。
如果你打算使用執行緒,常常會在多個子執行緒之間共享一些變數,常用的共享的變數可以是標量,陣列,雜湊(hash)之類,好象 glob 和子程式不行,不過也沒有必要了是吧。根據我的使用,我感覺是標量共享是直接使用,但雜湊,陣列只共享值的部分。
共享變數入門:
#!/usr/bin/perluse strict;
use threads;
use threads::
shared
;use data::
dumper;my
$val
: shared;
# 共享變數
my%hash
: shared;
# 共享陣列
my@array
: shared;
# 共享雜湊 my
$t1= threads->
create
(\&test1);
my$t2
= threads->
create
(\&test2);
$t1->
join
;# ** t1 的執行緒
$t2->
join
;print dumper(
\$val);
print dumper(
\@array);
print dumper(
\%hash);
sub test1
++;}
}sub test2
++;}
}
其實還是上乙個文章的例子,這個例子本來就是為這個文章設計的,上乙個例子有關 perl 的鎖,其實沒有必要寫成這樣。從上面我們可以見到,共享變數使用的時候 lock 一下,在建乙個共享的執行緒之間的變數是,要使用 shared 來指定.
引用的執行緒共享
好,上面是使用的普通的變數的共享變數,但我們能使用引用和物件來共享嗎?這是我們比較關心的。我們下面就來測試一下,引用在共享變數中是否能用.
use strict;use threads;
use threads::
shared;my
%hash
: shared;
my$t
= threads->
create
(\&test);
$t->
join
;sub test
++;}
輸出我們發現如下:
thread 1 terminated abnormally: invalid value for shared scalar at threads2.pl line 10.
我們發現,我們建了乙個共享的變數,%hash 時,沒有問題。但我們向 $hash 中放乙個匿名的雜湊變數時,被 threads::shared 模組檢查出來,講這個不能放入,所以導致錯誤。因為匿名的雜湊沒有宣告是不能共享的。
這是我們寫 perl 程式時常用的方法,不能共享引用,怎麼辦啦?
use strict;use threads;
use threads::
shared;my
%hash
: shared;
$hash
=&share()
;my$t= threads->
create
(\&test);
$t->
join
;sub test
++;}
在這,多了乙個 $hash = &share({}); 我們告訴執行緒,我們將要放入乙個共享的匿名的雜湊變數來做為引用。這時就可以使用引來了。所以在這種情況我們需要先宣告匿名的雜湊變數來做為引用。這時如果有多級的資料結構的引用也可以,使用相同的方法就行了,象 test 下面如果還有乙個 try 的話,就使用 $hash = &share ({});來一級一級的宣告。
如果我們是乙個新的 hash 需要加引用,只有一級二級,還好辦,要是我們的引用是多級,多級引用下面又有多線,我們就哭了,宣告共享變數都需要寫很多行,這時我們可以使用 threads::shared 提供給我們的 shared_clone 功能。
例如:
$var1=,'101班'
=>
,'100班'
=>
};
象上面這種,要照層次來宣告是很累的。還有這個資料結構本來就存要的話,在宣告也很累。所以使用 shared_clone 可以很好的解決。
use strict;use threads;
use threads::
shared
;use data::
dumper;my
$hash_ref
= shared_clone(
,'101班'
=>
,' 103班'
=>})
;my$t= threads->
create
(\&test);
$t->
join
;sub test
物件的執行緒共享
#!/usr/bin/perluse threads;
use threads::
shared;my
$obj
=&shared_clone
(foo->
new)
;# 要給變數宣告成共享 my
$th1
= threads->
create
(\&test1);
my$th2
= threads->
create
(\&test2);
$th1
->
join
;$th2
->
join
;$obj
->
display
;sub test1
}sub test2
}package foo;
subnew;my
$self
=bless
($data
,$class);
return
$self;}
sub add_number
++;}
sub display
."\n"}1
;
這其實一樣是使用的 shared_clone 記的使用物件的時候,需要鎖。
perl中的執行緒
1 直接執行子程式,按順序由上到下執行 乙個執行緒內執行 sub test0 test0 print main 0 n print main 1 n 結果 test0 0 test0 1 finish test0 main 0 main 1 2 用create建立執行緒後的執行過程 use thre...
linux多執行緒中的共享變數
當解決多執行緒互斥同步的問題時,經常會有如下幾個問題 1.在乙個給定的問題中,需要多少個mutex,多少個semaphore?有什麼規律?2.在對臨界區加鎖和等待訊號量的順序上有什麼要求和規律?3.什麼樣操作適合放在臨界區,什麼樣的不適合?下面就生產者和消費者問題來分析一些這幾個問題.下面是乙個簡單...
執行緒的共享互斥
所謂的執行緒的共享互斥 就是指乙個例項的一些方法在同一時刻,只能被乙個執行緒執行。實現方式如下 最簡單的辦法是將方法加上synchronized關鍵字,這樣,這個例項所有加了synchronized的方法在同一時間就只能被乙個執行緒訪問了。當方法結束後,鎖釋放。當鎖釋放後,那些因為鎖定而不得其門的多...