2010-03-26 80 views
1

我正在測試系統上的boost :: thread。它發生,我需要作爲一個fork(),因爲一個線程修改其他變量,甚至類的成員變量Boost :: Thread或fork():多線程HTTP代理

我做項目使用fork()還是有一些替代仍然使用boost :: thread?

基本上我在Linux和FreeBSD上運行這個程序。

它是一個http代理,在主線程中接受(),以及一個函數,該函數在創建服務的輔助線程中接受一個類(其中存在文件描述符套接字)。

是否有更好的方法來實現代理?

+0

「作爲fork()」的含義是什麼? – pajton 2010-03-26 18:34:31

+0

@pajton線程的變量不被其他人修改。 – osmano807 2010-03-26 18:39:12

回答

4

fork()產卵a 處理其具有獨立的存儲區域。更改必須通過IPC進行調解。

boost::thread創建一個線程它可以共享內存。

它們沒有可比性。


要創建線程本地存儲,請使用boost::thread_specific_ptr

請參閱http://www.boost.org/doc/libs/1_42_0/doc/html/thread/thread_local_storage.html

(您也可以裝飾一個全局變量作爲__thread int xyz;使其線程本地的,如果編譯器架構能夠支持它。)

+0

我使用boost ::線程只是不會落入並行線程_ *() – osmano807 2010-03-26 18:49:10

+0

@ osmano807:你的意思是你想創建*線程局部變量*(這是唯一的每個線程)? – kennytm 2010-03-26 18:56:32

+0

@KennyTM:是的,基本上它。有類的變量被修改,我認爲這將是解決方案。 – osmano807 2010-03-26 19:05:07

2

這聽起來像你想允許多個線程改變全局變量沒有影響任何其他線程的變化。通過分叉,應用程序的整個內存空間基本上都被複制,並且fork的每個分支都有自己的變量,除了通過IPC之外,兩個分支不能通信。

如果你想使用boost ::線程,你必須自己做這個拷貝,如果你不想讓線程相互影響,因爲相同的內存空間是所有線程之間常見。您可以爲每個線程函數創建局部變量。尤其是當你要開始讓線程共享數據

使用線程,而不是分流將更加靈活。如果你想擁有所有線程都可以改變的變量,那麼當它們被改變時,它們應該被互斥鎖保護,以便一次只有一個線程可以改變一個變量。