回答
這是不正確的,AtomicIsize等其實執行發送。它沒有列在文檔頁面上,因爲實現是自動轉發的,不像Sync,它必須爲它們明確派生。然而,一個簡單的'let v:&Send =&AtomicIsize :: new(5);'表明它們實現了Send。 – wingedsubmariner 2015-02-09 16:44:17
我已經編輯了@wingedsubmariner指出的錯誤部分。 – 2016-03-04 14:36:53
你可以直接檢查類型是否實現了這些特徵([play example](https://play.rust-lang.org/?gist=c9f429c722da91aaf4a450eedaf16e21&version=stable)) – dhardy 2017-11-02 10:16:18
首先,它認識到,大多數結構(或枚舉)是很重要Send
:
- 不包含任何引用任何結構可以
Send + 'static
- 包含有引用任何結構的
'a
下限期限可以是Send + 'a
其結果是,你通常會期望任何Sync
struct
是Send
也是如此,因爲Send
是一個很容易達到的範圍(與Sync
需要從多個線程進行安全併發修改的難度相比)要困難得多。
然而,沒有什麼能阻止一種類型的創建者特異性標記爲不Send
。例如,讓我們復甦條件吧!
在Lisp中,條件的思想是爲給定條件設置一個處理程序(例如:FileNotFound
),然後在堆棧深處滿足這個條件時調用你的處理程序。
你會如何在Rust中實現?
那麼,爲了保持線程的獨立性,你可以爲條件處理程序使用線程本地存儲(請參閱std::thread_local!
)。每個條件將是條件處理程序的一個堆棧,要麼只調用最上面的一個,要麼從上面的一個迭代過程開始,直到一個成功。
但是,那麼,你會如何設置它們?
就我個人而言,我會用RAII!我會綁定線程本地堆棧中的條件處理程序並將其註冊到框架中(例如,使用一個入侵雙向鏈表作爲堆棧)。
這樣,當我完成後,條件處理程序會自動取消自己的註冊。
當然,系統必須爲用戶做出意想不到的事情(如將條件處理程序存儲在堆中,而不是按照創建的順序將其刪除),這就是爲什麼我們使用雙向鏈表的原因,以便處理程序可以根據需要從堆棧中間取消註冊。
因此,我們有:
struct ConditionHandler<T> {
handler: T,
prev: Option<*mut ConditionHandler<T>>,
next: Option<*mut ConditionHandler<T>>,
}
和「真實」的處理程序是由用戶通過T
。
這個處理程序是Sync
?
可能,取決於你如何創建它,但沒有理由不能創建一個處理程序,以便它的引用不能在多個線程之間共享。
注意:這些線程無法訪問其數據成員,它們是私有的,不一定是Sync
。
該處理程序是Send
?
除非特別注意,否則不會。
的prev
和next
字段與併發訪問,即使在處理程序是,而另一個線程已獲得它(例如,另一個處理程序試圖註銷本身)的引用將被丟棄,然後這更糟糕的保護現在懸掛的引用會導致未定義的行爲。
注意:後一個問題意味着僅僅切換Option<*mut Handler<T>>
爲AtomicPtr<ConditionHandler<T>>
是不夠的;有關更多詳細信息,請參見Common Pitfalls in Writing Lock-Free Algorithms。
有你有它:一個ConditionHandler<T>
是Sync
如果T
是Sync
但絕不會Send
(這是)。
爲了完整起見,許多類型的實施Send
但不Sync
(最Send
類型,實際上):Option
或Vec
例如。
*讓我們復活吧!* - 你是一個瘋狂的,瘋狂的人。我喜歡它。 – Shepmaster 2016-03-04 16:30:43
- 1. 該類型的實例是什麼?
- 2. JPA/Hibernate實體類和同步的最佳實踐是什麼?
- 3. 什麼時候是類型(實例)而不是實例.__ class__?
- 4. 發現相同類型的兩個實體之間的差異
- 5. 爲什麼DbConnection.OpenAsync(CancellationToken)的默認實現是同步的?
- 6. 在Struts 1 Action類中有一個同步實例方法是什麼意思?
- 7. (類型)值和類型(值)之間的區別是什麼?
- 8. 基於同一接口實現的類型之間的轉換
- 9. 什麼是同步這個事件實現的最佳方法
- 10. 跨機器實現這種同步的好設計是什麼?
- 11. AS3 - 什麼是MyClass的(實例)和(實例作爲MyClass的)之間的差別
- 12. 爲什麼同一類的不同實例會相互覆蓋?
- 13. 爲什麼泛型類型的實例類與泛型類不一樣?
- 14. 在同一程序的多個實例之間同步
- 15. 爲什麼我的值不能保存在一個類型的實例之間?
- 16. 在以下示例中聲明一個同步方法的目的是什麼
- 17. 什麼是不同類型的java類?
- 18. 本地Postgres實例和Azure雲Postgres實例之間的實時同步
- 19. id類型實例變量發送消息到實例方法
- 20. codeigniter實例化的數據庫對象的類型是什麼?
- 21. 爲什麼Yesod中的ToJSON/FromJSON的Persistent類型實例不是?
- 22. 對象實例和同步的管家數據中的鎖定信息之間的關係是什麼?
- 23. 不同Markdown實現中的「角落案例」是什麼?
- 24. 實現電子郵件發送的最佳方式是什麼?
- 25. PhP的最佳實踐和現實世界中的進一步學習示例
- 26. MEF和同一類的兩個實例
- 27. 使用jQuery,我怎麼發現另一個類之間出現一類的所有實例
- 28. 實現的,而不是類的實例
- 29. DDD - 爲什麼實體的身份不僅僅是原始類型?
- 30. 線程和同步示例
[Huon Wilson關於'Send'和'Sync'的文章](https://huonw.github.io/blog/2015/02/some-notes-on-send-and-sync/)提到了一個假設垃圾收集的指針,'Gc',作爲可能是'Sync'而不是'Send'的東西,儘管他沒有詳細說明。 –
2016-02-17 18:14:24
@ JackO'Connor:給你吧:) – 2016-03-04 16:10:58
@MatthieuM謝謝! :) – 2016-03-04 21:11:44