Perl 的執行緒中的共享

2021-06-09 11:29:41 字數 3435 閱讀 5299

執行緒是乙個好東西,他不象程序占用那麼多的記憶體,因不他不需要主空間,不需要程序控制塊。他只共享所有主程序的所有內容。所以今天我們來研究一下執行緒的特點之一,共享的變數。

如果你打算使用執行緒,常常會在多個子執行緒之間共享一些變數,常用的共享的變數可以是標量,陣列,雜湊(hash)之類,好象 glob 和子程式不行,不過也沒有必要了是吧。根據我的使用,我感覺是標量共享是直接使用,但雜湊,陣列只共享值的部分。

共享變數入門:

#!/usr/bin/perl

use 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/perl

use 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的方法在同一時間就只能被乙個執行緒訪問了。當方法結束後,鎖釋放。當鎖釋放後,那些因為鎖定而不得其門的多...