2011-09-19 168 views
2

靜態分配,因爲我無法使用線程在這個問題A question on shared library and thread specific data描繪了socket描述符的具體數據,我打算申報具有兩個各行的過程中廣泛的全球陣列尋找出路元素pthread_t和int(用於socketfd)。因此,無論何時線程需要與服務器通信,它都會使用其標識(pthread_self())查找其套接字fd的數組,並使用它進行通信。多大太大的空間

但我想知道,而不是動態分配和釋放此結構的空間,每當有連接建立或分別斷開,如果我有一個數組的大小說1000 ...是太大/效率低(我將不得不搜索)? 1000個線程不會同時存在。所以陣列不會總是滿的。

感謝

回答

3

存儲這樣一個陣列,只有1000元很可能沒有,除非你正在運行在非常有限的資源硬件問題所需的空間。至於性能,這取決於你搜索數組的頻率......如果搜索不會在每個線程的生命週期中頻繁發生,那麼除非你有很高的性能標準,否則速度可能就足夠了。然而,如果你打算爲每個連接創建一個線程並在完成時終止線程,那麼更好的方法是設計一個包含線程在主程序中需要的所有信息的結構(比如套接字文件描述符),並在創建線程時將指向它的指針作爲線程的參數。

如果您確實使用每個連接的線程,那麼您可能還需要考慮爲線程設置小於默認的堆棧大小,以便創建大量線程不會佔用過多的內存爲堆棧空間。

2

首先,所需的1000個元素乘以一個的pthread_t的空間中的存儲器和一個int是微不足道的,除非你是嵌入式計算機或其它類似的限制系統。

關於搜索時間,通過1000個元素幼稚的搜索可能不會需要很長時間。然而,通過將其作爲hash table來實現,你可以使它變得非常快。

你也可以考慮,雖然,雖然內存分配是緩慢的,創造新主題也是在大多數操作系統上緩慢。 (但是,您可以使用thread pool來避免這種情況。)與後者相比,內存分配的成本可能會低於您的想象。與創建線程的上下文相比,您創建新線程的頻率如何?其他

一條意見:如果你真的關心性能,然後創建一個單獨的線程來處理每個連接是幾乎可以肯定不是要走的路,因爲環境的成本線之間切換。理想情況下,你想避免上下文切換,但保持所有的CPU忙。這意味着您需要與CPU相同數量的線程,並且每個線程都執行異步(非阻塞)I/O。

1

陣列將消耗空間,但將是最快的。由於1000個元素可以完全購買到內存中,並且不會作爲操作系統交換的一部分駐留在磁盤上,因此最多可能會導致緩存未命中。當多個線程查找他們的信息時,由於隨機訪問不會產生成本,因爲1000行的地址是按順序排列的;彼此相距不遠。

此外,當你每行malloc()時,你分配的每一行都不需要與先前分配的塊連續,並且當多個線程查找它們各自的信息時,會由於此而涉及某種隨機存取內存動態分配。

除非您有內存限制,否則不需要使用malloc()。陣列方法整潔,性能友好。

HTH

1

一般來說,多線程之間共享一個單一的數據結構是從性能上看不好,如果你需要從不同的線程更新。從一個線程更新結構會強制其他CPU使其緩存失效,同步原語(如互斥鎖)會產生額外的開銷和內存障礙。如果將元素與高速緩存行對齊,則可以稍微好一些,但這是硬件特定的。

話雖如此,我認爲相比連接設置成本,這種開銷可以忽略不計。但不要相信我,相信你的分析器