C / C ++中的跨平台线程/分叉与静态变量

时间:2011-07-10 00:15:10

标签: c++ multithreading static fork

我正在尝试编写一个服务器程序,可以跟踪某个对象的实例数。

目前我正在使用一个静态int,它在对象的构造函数中递增:

class myObj{
  public:
    static int numOfInstances;
    myObj();
};
int myObj::numOfInstances = 0;

myObj::myObj(){
    this->numOfInstances = ++myObj::numOfInstaces
}

但是我也想为每个连接分叉,子进程处理每个连接,父进程不断地监听新连接。

如果我使用fork(),则每个子进程都不会意识到新连接以及由此创建的新对象。

我认为线程可能是一个解决方案,但我不确定线程​​是否会被删除(大多数程序都会在线程中运行)。即使它是,它不符合ANSI标准,所以我宁愿找到一个使用fork的解决方案。

如果没有合适的解决方案,那么人们推荐使用哪种线程解决方案?我正在为Linux写作,但我更喜欢跨平台的解决方案。

2 个答案:

答案 0 :(得分:1)

多处理不是C ++标准的一部分。但是,如果您使用的是POSIX系统(您拥有fork()),则可以从操作系统获取共享内存;看看shmget()家族的功能。您将需要一些同步机制来访问共享内存(如互斥锁或信号量);这些也是提供的。

我建议man shm_overviewman sem_overview作为起点。

答案 1 :(得分:0)

我真的不知道资源共享在POSIX系统上是如何工作的(所以我不能告诉你是简单地fork()还是使用线程)但是还有可移植的Boost.Thread库,除了pthreads,如果你决定这样做。

请注意,您的代码中也存在争用条件;两个线程(无论是否在同一个进程中,所以在任何一种情况下)都无法在没有某种同步的情况下写入同一位置。