2010-03-26 83 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 ::线程,你必须自己做这个拷贝,如果你不想让线程相互影响,因为相同的内存空间是所有线程之间常见。您可以为每个线程函数创建局部变量。尤其是当你要开始让线程共享数据

使用线程,而不是分流将更加灵活。如果你想拥有所有线程都可以改变的变量,那么当它们被改变时,它们应该被互斥锁保护,以便一次只有一个线程可以改变一个变量。