2
A
回答
3
僅向TChan
寫入引用,則不會複製有效負載。如果一直複製所有數據的效率太低,並且由於數據是不可變的(一般來說,您可以作弊),因此僅傳輸引用是安全的。
2
要比丹尼爾精確一點(並且在他的評論中確認Daniels的懷疑):指向BinaryString構造函數的指針(你的意思是ByteString?)被寫入TVar。
讓我們通過檢查相關代碼進行確認。 TChan
是在TVar
建成,並使用writeTVar
寫值,界河是GHC.Conc.Sync
實現(通過GHC.Cont
和Control.Concurrent.STM.TVar
再出口):
-- |Write the supplied value into a TVar
writeTVar :: TVar a -> a -> STM()
writeTVar (TVar tvar#) val = STM $ \s1# ->
case writeTVar# tvar# val s1# of
s2# -> (# s2#,() #)
的爭論只是一起功能writeTVar#
,這是通過這是在實施rts/PrimOps.cmm
一個原始操作:
stg_writeTVarzh
{
W_ trec;
W_ tvar;
W_ new_value;
/* Args: R1 = TVar closure */
/* R2 = New value */
MAYBE_GC (R1_PTR & R2_PTR, stg_writeTVarzh); // Call to stmWriteTVar may allocate
trec = StgTSO_trec(CurrentTSO);
tvar = R1;
new_value = R2;
foreign "C" stmWriteTVar(MyCapability() "ptr", trec "ptr", tvar "ptr", new_value "ptr") [];
jump %ENTRY_CODE(Sp(0));
}
此包裝下面的代碼在rts/STM.c
:
void stmWriteTVar(Capability *cap,
StgTRecHeader *trec,
StgTVar *tvar,
StgClosure *new_value) {
StgTRecHeader *entry_in = NULL;
TRecEntry *entry = NULL;
TRACE("%p : stmWriteTVar(%p, %p)", trec, tvar, new_value);
ASSERT (trec != NO_TREC);
ASSERT (trec -> state == TREC_ACTIVE ||
trec -> state == TREC_CONDEMNED);
entry = get_entry_for(trec, tvar, &entry_in);
if (entry != NULL) {
if (entry_in == trec) {
// Entry found in our trec
entry -> new_value = new_value;
} else {
// Entry found in another trec
TRecEntry *new_entry = get_new_entry(cap, trec);
new_entry -> tvar = tvar;
new_entry -> expected_value = entry -> expected_value;
new_entry -> new_value = new_value;
}
} else {
// No entry found
StgClosure *current_value = read_current_value(trec, tvar);
TRecEntry *new_entry = get_new_entry(cap, trec);
new_entry -> tvar = tvar;
new_entry -> expected_value = current_value;
new_entry -> new_value = new_value;
}
TRACE("%p : stmWriteTVar done", trec);
}
而在這裏我們看到new_value
是一個永遠不會被查看並存儲的指針。
相關問題
- 1. 最大和最小的二進制樹的Haskell元件
- 2. 二進制文件大小
- 3. Cassandra和二進制文件
- 4. 巨大的二進制文件與objcopy
- 5. Haskell - 二進制搜索樹
- 6. Haskell二進制兼容性
- 7. Haskell二進制解析
- 8. 二進制文件和其他文件
- 9. Hessian與大型二進制文件
- 10. 寫大二進制數據到文件
- 11. Java更新大型二進制文件
- 12. 編輯大型二進制文件
- 13. 大型二進制文件添加
- 14. 網站源代碼控制和大設置二進制文件
- 15. 如何將資源編譯成Haskell中的二進制文件?
- 16. 使用Haskell的Parsec解析二進制文件?
- 17. 在Haskell中用Data.Binary.Get解析簡單的二進制文件
- 18. PDFKit和新的WKHTMLTOPDF二進制文件
- 19. Git和二進制文件的歷史
- 20. 構建haskell中的二進制數
- 21. 複製二進制文件
- 22. haskell - 如何從非主模塊創建二進制文件?
- 23. 使用Haskell將[Bool]寫入二進制文件
- 24. 發送二進制文件TcpClient - 文件比源文件大
- 25. 的Python:二進制文件
- 26. Hadoop的二進制文件
- 27. 巨大的二進制文件的大小,而LD鏈接
- 28. 在一個二進制文件中的C++多個大文件
- 29. 在Docker和Jenkins處理大型二進制文件(3 GB)
- 30. AIX二進制文件 - 大小和符號
你的意思是說引用得到默認複製,或者我應該這樣做嗎? – user1748906
這是默認設置,您不需要採取任何額外措施。如前所述,由於數據是不可變的,因此共享它是安全的,所以不需要複製它。 –
也許s /構造函數/一個參考/? –