我想在Linux下用C++編寫一個庫,它將幫助應用程序使用某種協議(實際上是FastCGI)。該庫將偵聽套接字(TCP或Unix),接收請求,將它們轉發給用戶代碼,併發送由所述用戶代碼生成的響應。C++/Linux:你如何編寫一個使用套接字的線程安全庫?
套接字上會有很多連接,並且每個連接都會攜帶很多請求(可能同時存在交叉機制)。用戶代碼(使用庫)很可能是多線程的,以並行處理多個請求。
我希望我的庫很健壯,儘可能少地假設/要求用戶代碼,包括使用的多線程類型。據我所知,Linux中的clone()
函數可以用幾十種不同的方式分支進程 - 有或沒有共享內存,共享文件句柄等。如何實現多線程的決定應由用戶決定。
這使我感到困惑,因爲庫代碼可以突然發現它自己,並且代碼的多個副本可以突然從相同的套接字讀取並處理相同的請求。更糟糕的是,父進程可能會終止,只留下子進程,進而產生更多的子進程,甚至可能在不同的進程名稱空間中 - 這是一團糟。
有哪些Linux工具可以幫助協調需要訪問相同外部資源(套接字)的相同代碼的所有副本?什麼是實現這種線程安全庫的標準方式?我必須自己選擇一種線程模型,並將其強加給我的圖書館的消費者嗎?
我們一口氣在談論線程,'fork' *和*'clone' ......這是一個很高的命令。 –
@KerrekSB:正如我所說的 - 我希望這個選擇(線程/ fork/clone)與我的庫的用戶一起駐留,並且庫應該能夠處理它的使用情況......如果可能的話,課程。 :P我也在某處讀到'fork()'實際上是'clone()'和一組特定的標誌。 –
@KerrekSB:P.S.我對Windows非常熟悉,但我還沒有在Linux上寫過任何可能顯示的內容。我試圖把我的大腦圍繞在Linux的做事方式上。 –