代码之家  ›  专栏  ›  技术社区  ›  Deep-B

将C++向量作为使用内存池的类中的成员

  •  5
  • Deep-B  · 技术社区  · 16 年前

    我一直在用ado/odbc编写一个用于数据库访问的多线程dll,用于遗留应用程序。我需要为每个线程保留多个数据库连接,所以我将每个连接的ADO对象放在一个对象中,并考虑将它们的数组保存在一个自定义的threadinfo对象中。显然,向量在这里会更好——我需要在移动中删除/重新排列对象,向量可以简化这一点。问题是,我为每个线程分配一个堆,以避免堆争用和其他东西,并从那里分配所有内存。

    所以我的问题是:如何从线程特定堆中分配向量?(或者它会在内部知道从它的包装器类中分配相同的内存——听起来不太可能,但我不是C++的家伙)我已经搜索了一点,看起来我可能需要编写一个分配器或东西——看起来像我不想做的那么多的工作。还有别的办法吗?我听说vector对里面的所有东西都使用了placement new,所以重载操作符new可以在里面工作吗?

    我对C++内部知识的了解不足,因为我主要是C程序员(甚至相对来说)。很可能我遗漏了一些基本的东西。如果没有更简单的事情发生-我可能只是去做阵列的事情,但希望它不会来。

    我在用MS-VC++6.0(嘿,笑起来太粗鲁了!:-P)。

    任何/所有的帮助都将不胜感激。

    2 回复  |  直到 16 年前
        1
  •  3
  •   sbi    16 年前

    如何从线程特定堆中进行向量分配?

    您(在编译时)向它传递一个适当的分配器。 Here 是关于如何做到这一点的经典。如果您遵循本文的建议(甚至只是复制代码并在需要时对其进行调整),对于C程序员来说,编写分配器可能比使用动态分配的数组正确地获得类的复制语义更容易。

    注意,如果您将对象放入向量(或您自己的数组,ftm)中,而向量本身使用堆(例如字符串),则您需要假定它们也使用您的特殊堆。用于标准库的容器( std::basic_string<> 是这样一个容器)这很容易,因为您也可以将分配器传递给它们。对于你自己的类型,你必须确保自己。

    尽可能快地远离vc6。它有毒。

        2
  •  0
  •   Chris Bednarski    16 年前

    查找declspec

    下面的代码声明了一个整数线程局部变量并用一个值初始化它:

    __declspec( thread ) int tls_i = 1;
    

    另一方面。长时间保持ADO连接打开不是一个好主意。数据库连接会遇到很多问题。它们将对应用程序打开。但是,当您发送查询时,它们会弹出一条“一般网络错误”消息。

    最好通过应用程序尽快关闭连接,并依赖操作系统管理的连接池。

    另外,根据连接到数据库的客户机的数量,可能会达到服务器端打开的套接字的最大数量。这是我的记忆。在客户端关闭连接后,服务器上的连接将进入时间等待状态。默认情况下,服务器套接字需要大约4分钟才能关闭,因此在此期间其他客户端无法使用它。归根结底,服务器上可用的套接字数量有限。保持太多连接打开可能会产生问题。

    抱歉,这里的话题太离题了。