2010-09-23 153 views
0

我很好奇多線程是什麼。我已經聽到了在StackOverflow中收到的答案,但我不知道它是什麼,所以我的主要兩個問題是它是什麼以及我如何從中受益?什麼是多線程?

編輯:

好,因爲第一個問題並沒有真正得到我一直在尋找,我會與此去響應..

我從來沒有聽說過的「穿透」甚至在其他語言。這是我在互聯網上找到的一個例子:

#!/usr/bin/perl 

use strict; 
use warnings; 
use threads; 
use threads::shared; 

print "Starting main program\n"; 

my @threads; 
for (my $count = 1; $count <= 10; $count++) { 
     my $t = threads->new(\&sub1, $count); 
     push(@threads,$t); 
} 
foreach (@threads) { 
     my $num = $_->join; 
     print "done with $num\n"; 
} 
print "End of main program\n"; 

sub sub1 { 
     my $num = shift; 
     print "started thread $num\n"; 
     sleep $num; 
     print "done with thread $num\n"; 
     return $num; 
} 

我似乎無法理解它在做什麼。任何人都可以照亮任何光明? 問候, 菲爾

+12

您是否嘗試閱讀Wikipeadia - http://en.wikipedia.org/wiki/Multithreading? perl中有關於線程的一些特殊的東西,但總體思路與所有其他語言相同。 – 2010-09-23 15:41:46

+4

線程安全年輕蚱蜢 – Chris 2010-09-23 15:54:09

+1

您是否運行了Perl代碼,並觀察輸出? – 2010-09-23 16:28:24

回答

1

它就像fork ing,但重量更輕,並且在線程之間共享數據比在進程之間更容易。不足之處在於,由於共享數據,編寫錯誤代碼比較容易(線程a修改線程b認爲應該保持不變,線程a獲取資源c的鎖並嘗試獲取資源d的鎖,但是線程b對資源d具有鎖定,並試圖獲取對資源c的鎖定等)。

4

線程化是一種讓不止一件事同時發生的方式,至少從概念上講(在單核單CPU計算機上,可能帶有ARM或Atom,只有一個執行線程在時間)。

Perl示例同時啓動十個不同的代碼段。每一塊代碼只需要關心它正在做什麼,而不必擔心其他事情。這意味着你可以用一個簡單的子程序輸出Perl程序,這個簡單的子程序以合理簡單的方式稱爲十次。

一個用途是在與用戶交互的程序中。通常需要有一個響應式界面以及幕後發生的事情。在一塊代碼中很難做到這一點,因此界面通常在一個線程中,而在其他線程中則是幕後的東西,因此界面可以很快速並且後臺任務正在運行。

如果您熟悉運行多個進程,線程非常相似,但它們之間的連接更加緊密。這意味着在線程之間建立和通信更容易,但是由於不允許執行所有可能的命令,也很容易搞砸。