我正在尝试编写一个服务器程序,可以跟踪某个对象的实例数。
目前我正在使用一个静态int,它在对象的构造函数中递增:
class myObj{
public:
static int numOfInstances;
myObj();
};
int myObj::numOfInstances = 0;
myObj::myObj(){
this->numOfInstances = ++myObj::numOfInstaces
}
但是我也想为每个连接分叉,子进程处理每个连接,父进程不断地监听新连接。
如果我使用fork(),则每个子进程都不会意识到新连接以及由此创建的新对象。
我认为线程可能是一个解决方案,但我不确定线程是否会被删除(大多数程序都会在线程中运行)。即使它是,它不符合ANSI标准,所以我宁愿找到一个使用fork的解决方案。
如果没有合适的解决方案,那么人们推荐使用哪种线程解决方案?我正在为Linux写作,但我更喜欢跨平台的解决方案。
答案 0 :(得分:1)
多处理不是C ++标准的一部分。但是,如果您使用的是POSIX系统(您拥有fork()
),则可以从操作系统获取共享内存;看看shmget()
家族的功能。您将需要一些同步机制来访问共享内存(如互斥锁或信号量);这些也是提供的。
我建议man shm_overview
和man sem_overview
作为起点。
答案 1 :(得分:0)
我真的不知道资源共享在POSIX系统上是如何工作的(所以我不能告诉你是简单地fork()
还是使用线程)但是还有可移植的Boost.Thread库,除了pthreads,如果你决定这样做。
请注意,您的代码中也存在争用条件;两个线程(无论是否在同一个进程中,所以在任何一种情况下)都无法在没有某种同步的情况下写入同一位置。