亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪(fǎng)問(wèn)板塊 發(fā)新帖
查看: 4142 | 回復(fù): 6
打印 上一主題 下一主題

perl多線(xiàn)程 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2008-08-26 15:03 |只看該作者 |倒序?yàn)g覽
在大駱駝書(shū)里有這么一段:
17.2.2.3 鎖定子過(guò)程
你可以在一個(gè)子過(guò)程上加一把鎖:

lock &func;

和數(shù)據(jù)鎖不一樣,數(shù)據(jù)鎖只有勸告性鎖,而子過(guò)程鎖是強(qiáng)制性的。除了擁有鎖的線(xiàn)程以外其它線(xiàn)程都不能進(jìn)入子過(guò)程。

考慮一下下面的代碼,它包含一個(gè)涉及 $done 變量的沖突條件。(yield 只是用于演示)。


use Thread qw/async yield/;
my $done = 0;
sub frob {
        my $arg = shift;
        my $tid = Thread->self->tid;
        print "thread $tid: frob $arg\n";
        yield;
        unless ($done) {
                yield;
                $done++;
                frob($arg + 10);
        }
}如果你這樣運(yùn)行:


my @t;
for my $i (1..3) {
        push @t, Thread->new(\&frob, $i);
}
for (@t) { $_->join}
print "done is $done\n";下面是輸出(哦,有時(shí)候是這樣的——輸出是不可預(yù)料的):


thread 1: frob 1
thread 2: frob 2
thread 3: frob 3
thread 1: frob 11
thread 2: frob 12
thread 3: frob 13
done is 3
不過(guò)如果你這么運(yùn)行:


for my $i (1..3) {
        push @t, async {
                lock &frob;
                frob($i);
        };
}
for (@t) { $_->join }
print "done is $done\n";輸出是下面的東西:


thread 1: frob 1
thread 1: frob 11
thread 2: frob 2
thread 3: frob 3
done is 1


不太明白,請(qǐng)教一下:
1,use Thread qw/async yield/;是什么意思?
2,$done這個(gè)變量如何被改變?我覺(jué)得unless那段應(yīng)該不會(huì)運(yùn)行

謝謝

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2008-08-26 15:05 |只看該作者
另外,誰(shuí)有perl多線(xiàn)程的文章,發(fā)個(gè)鏈接?謝謝

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2008-08-26 15:10 |只看該作者
my $thr = threads->create({'context' => 'list'}, \&foo);
這種寫(xiě)法中,{'context' => 'list'}是什么意思?謝謝大俠們!

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2008-08-26 22:25 |只看該作者
頂下

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2008-08-26 22:40 |只看該作者
1,use Thread qw/async yield/;是什么意思?  

Re: Programming Perl 11.2 Creating Modules.
use Bestiary qw(ram @llama);     # Import the ram function and @llama array

use Thread qw/async yield/; # qw/async yield/ is a list of variable(s), function(s), etc

2,$done這個(gè)變量如何被改變?我覺(jué)得unless那段應(yīng)該不會(huì)運(yùn)行
$done is a global variable here, if you want to modify a variable by different threads, you can study CPAN Thread::Shared

my $thr = threads->create({'context' => 'list'}, \&foo);

{'context' => 'list'}: a referent to anonymous hash.
Same thing like below:
my %hash = ('context'=>'list');
my $hashref = \%hash;
my $thr = threads->create($hashref, \&foo);

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2008-08-27 10:18 |只看該作者
謝謝樓上的解答,很詳細(xì):)
第二個(gè)問(wèn)題我還是不太明白:
$done = 0
在線(xiàn)程中,unless($done)以后應(yīng)該都不會(huì)執(zhí)行的,$done++也就無(wú)法執(zhí)行,不知我這樣理解是否有誤?謝謝

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2008-08-27 12:19 |只看該作者
原帖由 lifeistrue 于 2008-8-27 10:18 發(fā)表
謝謝樓上的解答,很詳細(xì):)
第二個(gè)問(wèn)題我還是不太明白:
$done = 0
在線(xiàn)程中,unless($done)以后應(yīng)該都不會(huì)執(zhí)行的,$done++也就無(wú)法執(zhí)行,不知我這樣理解是否有誤?謝謝


我的理解是,不一定就不執(zhí)行,因?yàn)槟銌?dòng)線(xiàn)程的這個(gè)時(shí)候$done還是0. 同時(shí)這也是為什么有不確定性。如果啟動(dòng)的3個(gè)線(xiàn)程到那個(gè)check的時(shí)候,done 還沒(méi)變, 那么這個(gè)block就都能執(zhí)行,里面有點(diǎn)race的意思。

結(jié)果可以是1,2, 3, 也有可能是2,3,1 。。。

如果你在for loop 里面加個(gè)sleep,我估計(jì)也就只能執(zhí)行一次了。

用lock和沒(méi)用的,打印結(jié)果比較一下,就是這個(gè)意思。加了lock之后,2 和 3 就去不了哪個(gè)block了。
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專(zhuān)區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP