nodejs C ++共享对象

时间:2014-08-05 13:43:50

标签: c++ node.js

概述:

我有一个NodeJS服务器,里面有几个C ++模块,执行一个整体“工作”。这些模块中的一些对象(C ++对象,比如说“单例”)很常见,初始化后的状态应该在每个模块之间共享。这些对象的初始化必须在服务器启动期间完成一次。

示例:

A,B - 应该作为一个作业执行的独立C ++模块

x,y,z - 共享C ++对象(可能很多)

  1. 服务器接收(http)请求并使用 A 处理它 x y z
  2. (http)响应从 A 转到客户端。
  3. 服务器接收另一个(http)请求,并使用 x y z B 中对其进行处理
  4. (http)响应从 B 传递到客户端。
  5. 问题:

    你能否告诉我在所有C ++模块之间是否有一些已知的最佳初始化和共享这些对象的做法?

    NodeJS中特定C ++模块的生命周期是什么?什么时候从记忆中删除?

1 个答案:

答案 0 :(得分:1)

如果您正在使用boost库,则可以创建可在模块之间共享的内存段。

例如,您希望在模块A和B之间共享100 int

然后您的模块A的代码将如下所示(为简洁起见,省略了错误检查):

// Shared memory creation
shared_memory_object shm (create_only, "My100INTs", read_write);
shm.truncate(100 * sizeof(int));
mapped_region region(shm, read_write);

// Get the address of the first element
int* theMemory = static_cast<int*>(region.get_address());

// Initialization Code
for (int i = 0; i < 100; i++) {
    *(theMemory + i) = i;
}

由于A包含初始化代码,因此在您的node.js代码中,在需要B之前必须先要求A.

在模块B中,您可以像这样访问它们(为简洁起见,省略了错误检查):

// Open the previously created shared memory
shared_memory_object shm (open_only, "My100INTs", read_write);
mapped_region region(shm, read_write);

// Get the address of the first element
int* theMemory = static_cast<int*>(region.get_address());

// Do modification
for (int i = 0; i < 100; i++) {
    *(theMemory + i) *= 2;
}

此共享内存具有内核或文件系统持久性,因此,当您不再使用它时,必须显式释放它们。你可以这样做:

delete region;
remove("My100INTs");

希望这有帮助。