Boost :: Thread或fork():多线程HTTP代理

时间:2010-03-26 18:30:43

标签: c++ multithreading boost

我在系统上测试boost :: thread。碰巧我需要充当fork(),因为一个线程修改了其他变量,甚至是类的成员变量

我使用fork()做项目还是有一些替代方法仍在使用boost :: thread?

基本上我在Linux中运行这个程序,也许是FreeBSD。

它是一个http代理,主线程中的accept(),以及一个接受一个类(其中有文件描述符套接字)的函数,它在创建服务的辅助线程中。

有没有更好的方法来实现代理?

2 个答案:

答案 0 :(得分:4)

fork()会产生一个进程,它具有独立的内存区域。变更必须通过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;以使其成为线程本地的。)

答案 1 :(得分:2)

听起来你正试图允许多个线程改变全局变量,而没有其他线程影响任何其他线程。通过分叉,应用程序的整个内存空间基本上被复制,并且fork的每个分支都有自己的变量,除了通过IPC之外,两个分支不能通信。

如果你想使用boost :: thread,你必须自己复制,如果你不希望线程相互影响,因为所有线程中都有相同的内存空间。您可以只为每个线程函数创建局部变量。

使用线程而不是forking将更加灵活,尤其是当您想要开始让线程共享数据时。如果你想拥有所有线程都可以改变的变量,那么在被改变时它们应该被互斥锁保护,这样只有一个线程可以一次改变一个变量。