我在系统上测试boost :: thread。碰巧我需要充当fork(),因为一个线程修改了其他变量,甚至是类的成员变量
我使用fork()做项目还是有一些替代方法仍在使用boost :: thread?
基本上我在Linux中运行这个程序,也许是FreeBSD。
它是一个http代理,主线程中的accept(),以及一个接受一个类(其中有文件描述符套接字)的函数,它在创建服务的辅助线程中。
有没有更好的方法来实现代理?
答案 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将更加灵活,尤其是当您想要开始让线程共享数据时。如果你想拥有所有线程都可以改变的变量,那么在被改变时它们应该被互斥锁保护,这样只有一个线程可以一次改变一个变量。