2010-03-01 57 views
15

我正在使用Linux和Win32套接字API。在我的程序中,多個線程共享一個套接字句柄。特別地,多個線程使用共享的套接字句柄(即,相同的端口)調用send。在這種情況下,我是否必須鎖定線程安全性?我無法找到答案。我可以做一個測試,但想聽聽你的經驗。C socket API是線程安全的嗎?

EDIT:我知道通過套接字發送數據根本不是原子操作。當然,我們必須使用互斥體來保證線程安全。但是,我想知道系統API是否可以擁有自己的內部鎖。如果是這樣,我們可以省略把自己的鎖。

此問題也適用於fprintf函數。我想知道這樣的系統API會擁有自己的鎖。根據我的經驗,從多個線程調用fprintf並沒有殺死我的程序,儘管文件或stdout上有比賽(即不一致或不可預知的輸出,但程序沒有崩潰),這暗示fprintf有一個鎖來保護它們的內部數據結構。

+0

在我看來,多線程讀取和寫入同一個套接字是事實上的設計問題。 – theMayer 2018-02-12 20:10:33

回答

0

通過套接字發送數據不是原子事務 - 任何非原子事務都需要鎖定/同步。這與平臺無關。

+1

謝謝。是的,我知道這根本不是原子操作。但是,我想知道系統API是否可以擁有自己的內部鎖。 – minjang 2010-03-01 07:56:05

+4

但是,如果他們這樣做,將使他們原子... – EJP 2010-03-01 08:01:36

11

套接字不是C++標準的一部分,因此它取決於實現。通常它們不是線程安全的,因爲send不是原子操作。請參閱this discussion瞭解更多信息。

編輯:操作系統可能有或沒有內部鎖保護內部結構。這取決於實施。所以你不應該指望它。

+0

聽起來像POSIX發送/ recv是線程安全的基於您的鏈接和本次討論:http://stackoverflow.com/a/1981439/602245 – Brett 2013-02-10 17:46:19

0

不,接受創建的變量不需要互斥。線程使用的任何數據至少應該是信號量。

sem_t* sem_data; 
2

我發現多個socket close()文件描述符調用在併發環境中非常危險。

通常會忽略多個調用,但在其他線程打開另一個文件描述符的情況下,通常它會獲取以前的文件描述符,並開始惡夢。