[英]is winsock2 thread safe?
我正在寫一個小型3服務器和1個客戶端程序。 2個服務器發送tcp消息,最后一個使用winsock2發送upd數據報。
我想知道我是否可以通過使用線程(OpenMP或boost :: threads)來模擬recvfrom(),以便2個線程同時從同一端口上的同一個套接字進行監聽。
我在windows7上使用VC ++ 2010。
謝謝您的幫助。
是的,套接字是線程安全的,但是你必須要小心。 一種常見的模式(當使用阻塞IO時)是讓一個線程在套接字上接收數據而另一個線程在同一個套接字上發送數據。 讓多個線程從套接字接收數據通常適用於UDP套接字,但對大多數時候TCP套接字沒有多大意義。 WSARecv的文檔中有一個警告:
不應在同一個套接字上同時從不同的線程調用WSARecv,因為它可能導致不可預測的緩沖區順序。
但是,如果您使用UDP並且協議是無狀態的,這通常不會引起任何問題。
另請注意, WSAEINPROGRESS
錯誤代碼主要適用於Winsock 1.1:
WSAEINPROGRESS:正在阻止Windows Sockets 1.1調用,或者服務提供程序仍在處理回調函數。
而WSAEINPROGRESS
的描述進一步指出:
操作正在進行中。
阻止操作當前正在執行。 Windows套接字僅允許單個阻塞操作 - 每個任務或線程 - 未完成,並且如果進行任何其他函數調用(無論它是否引用該套接字或任何其他套接字),該函數將失敗並出現WSAEINPROGRESS錯誤。
請注意,這涉及每個任務或線程的單個阻塞操作。
此外,WSARecv的文檔中還有一個警告:
在APC內發出另一個阻塞Winsock調用,該調用在同一個線程上中斷正在進行的阻塞Winsock調用將導致未定義的行為,並且Winsock客戶端絕不能嘗試。
但除了那些警告你應該沒事。
更新:添加一些外部引用: alt.winsock.programming:socket是否是線程安全的? 和Winsock程序員的常見問題解答:Winsock是否是線程安全的?
Winsock只允許在套接字上進行一次阻塞IO調用。 來自不同線程的多個阻塞調用最終會出現“WSAEINPROGRESS”錯誤。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668%28v=vs.85%29.aspx#WSAEINPROGRESS 。
如果要進行並發IO請求,可以嘗試使用異步IO或重疊IO(在Windows用法中)。 但我想你會希望並發處理數據而不是並發讀取數據。 在這種情況下,您可以讓一個線程發出IO請求,其他線程進行處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.