2014-06-24 29 views
1

我已經創建了一個preforking web服務器,該服務器創建服務器套接字,綁定服務器套接字,偵聽地址和端口,並預先指定數量的作爲服務於客戶端請求的工作人員的工作人員(子進程)。進行套接字編程時,是否需要使用鎖定函數作爲accept函數?

所有工作程序都會繼承父服務器的套接字描述符並使用它來接受客戶端請求。子進程以「並行」方式作爲自治進程運行,並使用服務器套接字描述符的accept函數。在接受客戶請求或操作系統爲我執行此操作時,是否必須對accept函數使用鎖定和解鎖機制?這裏的想法是,多個進程使用通用服務器套接字描述符來接受客戶端請求。我是否必須用互斥機制來屏蔽這種情況,以避免競爭狀況或僵局?

請注意我在accept函數中使用I/O非阻塞。

我有以下代碼:

for(;;) { 
    int client = accept(...); 
    if (client < 0) continue; 
    ... 
} 

我應該使用類似:

for(;;) { 
    lock(); 
    int client = accept(...); 
    unlock(); 
    if (client < 0) continue; 
    ... 
} 

+0

http://stackoverflow.com/questions/1981372 –

+1

該文章處理不同的線程和發送/ recv調用。但是,我想知道在不同的流程中接受呼叫。 –

+0

這不是真的嗎? –

回答

2

不是。這是一個系統調用,因此是原子。

+2

這是正確的,所以我不會添加其他答案。在早期,出現了雷鳴般的牛羣問題,所以用鎖來緩解這個問題,但操作仍然是原子的。 – jxh

+1

我看過這篇文章:http://uwsgi-docs.readthedocs.org/en/latest/articles/SerializingAccept.html。也許它不是100%解決?我可能需要考慮鎖定/解鎖? –

+0

任何人都可以告訴我,如果在使用接受和解鎖之前必須鎖定嗎?或接受受保護的操作系統? –

相關問題