2012-07-17 48 views
4

在Haskell中,forkIO創建一個未綁定(Haskell)線程,而forkOS創建一個綁定(本地)線程。我之前提到的問題here的答案我已經提到Haskell線程不保證保持在同一個OS線程上,這似乎受Control.Concurrent模塊文檔的支持。我的問題是,如果正在運行的Haskell線程被交換到另一個操作系統線程,其ThreadID是否保持不變?在OS線程周圍混洗Haskell線程時,ThreadID是否一致?

+0

forkOS不會創建新的操作系統線程,它會將該輕量級線程綁定爲僅在單個操作系統線程上運行。這對於像OpenGL這樣的在幕後使用線程特定數據的東西很重要。 – Axman6 2012-07-18 12:21:42

回答

8

是的。

A ThreadId是表示線程句柄的抽象類型。

這是你如何發送異步信號到特定的線程:與ThreadId。無論涉及哪個操作系統線程都無關緊要,並且目標線程通常很有可能不會綁定到任何操作系統線程(例如,它正在休眠)。

「OS線程」的存在在某種程度上是一個實現細節,儘管如果您將FFI與某些庫一起使用,則需要對它們進行管理。否則,你可以忽略代碼中的OS線程。

相關問題