由於Windows不提供UNIX域套接字,因此我使用本地TCP連接來模擬行爲。現在,POSIX保證,如果有多個線程並行寫入UNIX域套接字,則會自動處理到PIPE_BUF的塊 - 即不會發生交織。本地TCP winsock是否有類似的保證,還是我必須使用臨界區來同步編寫器?Winsocks上的原子性保證?
回答
如果你有幾個線程寫入同一個套接字,那麼每個寫入調用都是原子的,但是每個寫入調用相對於在不同線程上發生的其他寫入調用是交錯的;
因此,如果你有一個線程1在一個單獨的寫入中寫入A的字符串,並且線程2用一個寫入和一系列的C寫入一系列的B和另一個,那麼你可能會得到ABC或BAC或BCA,但是你不會得到A的一個破碎的運行與中間的一些B ...
如果您要求由線程2發出的兩個寫入不與由線程1發出的寫入交錯(即ABC和BCA是好的,但BAC不是),那麼你應該使用WSABUF結構數組中的兩個緩衝區對線程2中的WSASend()
進行單個調用(或分散/集中寫入),或者需要鎖定寫入調用,以便線程1不能中斷。
太好了。我的意思是前者。行爲是否記錄在某個地方? – sustrik 2010-05-03 18:10:21
不是這樣,儘管我已經使用這個假設重疊I/O服務器已經有10多年了,而這一直是我見過的行爲;你可以把這個「WSASend不應該在不同的線程中同時調用同一個套接字,因爲它可能導致不可預知的緩衝區順序。」從這裏:http://msdn.microsoft.com/en-us/library/ms742203(VS.85).aspx作爲緩衝區本身不分裂的指示;但它是模糊的... – 2010-05-03 19:56:28
- 1. Spring AOP是否保證了原子性?
- 2. HBase如何保證行級原子性?
- 3. Redis Multi確保原子性
- 4. Winsocks兼容性問題
- 5. 嵌套的原子操作保證是原子嗎?
- 6. 具有保證原子性的單位操作
- 7. GPU上非原子寫入的弱保證?
- 8. 三階段提交協議(3PC)如何保證原子性?
- 9. BigQuery爲查詢作業提供了什麼原子性保證?
- 10. Erlang有向圖原子性和隔離保證
- 11. 原子變量是否保證內存可見性?
- 12. 確保Linux上的「鎖定」方法的原子性?
- 13. Oracle 11g重命名。保證是原子?
- 14. 更新這裏選擇,保證原子
- 15. 確保django模型字段只寫入一次?原子性保證沒有鎖
- 16. 確保保存模型時的原子性
- 17. objc_setAssociatedObject保留原子或非原子
- 18. 如何保證跨兩個數據庫(文件系統和RDBMS)的原子性?
- 19. Oracle上的事務完整性保證
- 20. 如何保證原子SQL插入子查詢?
- 21. 帶WinSocks的Qt(Creator)(ws2_32)
- 22. (保留,非原子)和(非原子,保留)有什麼區別?
- 23. 下面的複合查詢是否保證是原子的?
- 24. 原子性與openTempFile
- 25. 子程序的代碼確保原子
- 26. python中的變量保證是原子嗎?
- 27. C++ 0x的柵欄只保證原子或內存一般
- 28. 關於原子指針賦值的保證
- 29. 讀取對象的易失性引用是否保證原子讀取其屬性的最新值?
- 30. 驗證Maven原型屬性
我以爲Windows提供的郵件插槽與Unix本地插槽一樣。並命名管道。 – 2010-05-03 17:51:20
命名管道的問題是AFAIK無法選擇()它們。 – sustrik 2010-05-03 18:02:56