2012-02-29 60 views
11

我想進入與D編程,我遇到了一些問題。我開始使用core.thread Thread類,它爲啓動一個線程提供支持,然後將當前線程加入它。 D似乎希望人們使用消息傳遞,而不是鎖定/同步方法,所以我想我會試一試,但是我看到的每個消息傳遞示例都需要我無法從Thread類獲得的tid。我在網上看到的代碼示例實際上使用了spawn,它返回的是tid而不是使用Thread wrapper,然後使用tid將消息傳遞給Thread。但現在似乎沒有任何方法可以加入到基於其tid的線程中!不僅如此,而且你似乎無法產生一個委託,這就需要我添加不必要的間接級別。D語言 - 線程vs產卵

所以我的問題首先是爲什麼有兩種完全不同的線程風格?第二,爲什麼他們在一起提供幾乎所有你可能需要的東西時都不完整?

回答

8

core.thread爲線程提供了基本的低級原語。 std.concurrency內部使用core.thread。 A tid只能從std.concurrency.spawn獲得。

所以我的問題首先是爲什麼有兩種完全不同的線程風格?

你可能會問,爲什麼有兩種方法來編寫代碼,普通的D和內聯彙編代碼。有高(er)級和低級。

第二,爲什麼當他們一起提供基本上所有你可能需要的東西時,他們都不完整?

它們不是不完整的,但是您的多線程必須被設計爲可以在其中一個或另一箇中工作。如果std.concurrency允許任意訪問Thread等,它所做出的保證可能並不那麼強大。

要回答你的更具體的問題,它需要一個function,而不是一個delegate因爲delegate獲取上下文的指針,它允許突變,這將打破一些std.concurrency的假設。請注意,spawn不允許參數有可變間接,所以no委託的東西不應該令人震驚。

而不是加入,你會發送一個「停止」消息到你的線程。再次,這是更高的水平,並使用更高層次的結構。

+0

那麼當線程結束時,我該如何判斷呢?只要說你有一個沒有做任何事的主體和另一個正在運行的線程。通常我只需要調用thread.join()。如何通過消息傳遞做同樣的事情,因爲main是默認線程,並且沒有tid,因此不能接收任何消息? – Floss 2012-02-29 21:05:41

+0

使用'receive'或'receiveOnly'。 – Bernard 2012-02-29 21:30:16

+2

@Floss在任務完成時發送'Stopped'結構,並對其執行recieveOnly,同時'thisTid'將給出當前線程的tid(即使它還不存在)(包括主線程和任何線程以'Thread.start'開始) – 2012-02-29 21:36:21