5

我一直在使用 ADO/ODBC 编写用于数据库访问的多线程 DLL,以便与旧版应用程序一起使用。我需要为每个线程保留多个数据库连接,因此我将每个连接的 ADO 对象放在一个对象中,并考虑将它们的数组保存在自定义 threadInfo 对象中。显然,向量在这里会更好——我需要在旅途中删除/重新排列对象,而向量会简化这一点。问题是,我为每个线程分配一个堆以避免堆争用和其他东西,并从那里分配我所有的内存。

所以我的问题是:如何使向量从特定于线程的堆中分配?(或者它会在内部知道从与其包装类相同的堆中分配内存 - 听起来不太可能,但我不是 C++ 人)我搜索了一下,看起来我可能需要编写一个分配器或其他东西 -这看起来像是我不想要的很多工作。还有其他方法吗?我听说 vector 对它里面的所有东西都使用了placement-new,那么重载 operator new 可以在其中工作吗?

我对 C++ 内部知识的匮乏无济于事,因为我主要是一名 C 程序员(即使是这样 - 相对而言)。我很可能在某处遗漏了一些基本的东西。如果没有更容易的事情出现 - 我可能会去做阵列的事情,但希望它不会变成那样。

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

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

4

2 回答 2

3

如何使向量从特定于线程的堆中分配?

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

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

并尝试尽快摆脱​​ VC6。它有毒。

于 2010-04-03T08:38:11.137 回答
0

查找 __declspec

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

__declspec( thread ) int tls_i = 1;

另一个注意事项。长时间保持 ADO 连接打开不是一个好主意。您会遇到很多与数据库连接有关的问题。它们将显示为对应用程序开放。但是,当您发送查询时,它们会显示“一般网络错误”消息。

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

此外,根据连接到数据库的客户端数量,您可能会达到服务器端打开的最大套接字数。这是来自记忆。一旦在客户端关闭连接,服务器上的连接就会进入 TIME_WAIT 状态。默认情况下,服务器套接字大约需要 4 分钟才能关闭,因此在此期间它对其他客户端不可用。底线是服务器上可用的套接字数量有限。保持打开太多连接会产生问题。

抱歉,这里跑题了。

于 2010-04-03T09:27:42.917 回答