【问题标题】:Cross-Platform Threading/Forking-with-static-variables in C/C++C/C++ 中的跨平台线程/带静态变量的分叉
【发布时间】:2011-10-02 01:47:09
【问题描述】:

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

目前我正在使用在对象的构造函数期间递增的静态 int:

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

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

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

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

我认为线程可能是一种解决方案,但我不确定是否为这种事情剪断了线程(大多数程序将在线程中运行)。即使是这样,它也不在ANSI标准中,所以我宁愿找到一个使用fork的解决方案。

如果 fork 没有合理的解决方案,人们推荐哪种线程解决方案?我正在为 Linux 编写,但我更喜欢跨平台解决方案。

【问题讨论】:

  • 如果您只需要进程计数器,您可以分配一些共享内存并继续使用fork()。顺便说一句,虽然它是 POSIX,但它仍然不是 ANSI C。再说一遍,POSIX 线程也是如此。
  • 谢谢,这是一个不错的选择。我可能已经准备在 Winsock 和 sys/socket.h 之间交换套接字,所以我总是可以在 shmget 和其他东西之间交换。有没有一个好的 Windows 替代 shmget?
  • Windows也有内存映射,搜索MSDN即可。当然,这些函数有不同的名称,但这个概念在 Windows 和 POSIX 中一样存在。
  • Kerrek,如果您将此作为答案,我会接受。

标签: c++ multithreading static fork


【解决方案1】:

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

我建议将man shm_overviewman sem_overview 作为起点。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-17
      • 1970-01-01
      • 2013-03-29
      • 1970-01-01
      • 2012-08-16
      • 2011-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多