Visual C++优化对大型数据集合的并发访问
2010-08-22 20:47:32 来源:WEB开发网摘要 应用程序性能不仅仅与速度有关。在 Web 服务器环境中,卓越的性能还意味着确保可以并发地为最大数量的用户服务。这可以通过高效地使用多处理器计算机和线程管理来达到。本文介绍了可以解决许多并发性问题的技术。一种方法是使用线程管理,在线程基础上控制对数据库的访问 — 这可以保护数据的完整性。在本文中,生成并提供了可重用的线程类。然后,对这些类进行了测试,并在实际环境中分析了它们的性能。
服务器应用程序的成功与否迟早将归结为性能。但是,服务器应用程序中的性能不完全等同于纯粹的速度。您还必须考虑并发性 — 即您能够同时为多少个客户端提供服务。实际上,对于服务器而言,并发性通常要比纯速度更为重要,尤其是对带有许多 CPU 的高端硬件而言。具有低并发性的服务器应用程序只是无法利用多个 CPU(无论该应用程序有多么快)。
我不知道是否有简单明了的用于优化并发性的处方,但多年以来,我已经形成了大量能够提供巨大帮助的窍门。其中一个窍门可以很好地同步对大型集合中的对象的访问,而不会牺牲并发性。本文将演示我的技巧。首先,我将说明一个小型多线程示例程序,该程序演示了并发访问大型集合中的对象的需要。然后,我将开发一个能够解决该问题的可重用类,并且将比较得到的性能数值。作为一项附加的好处,该示例程序将包含一组便于使用的、用于创建和同步线程的类(当然是可重用的)。
示例代码可在 Windows 98 Second Edition、带有 Service Pack 6a 的 Windows NT 或带有 Service Pack 1 的 Windows 2000 上运行(它或许可以在其他版本上运行,但以上版本是我测试过的全部版本。)而且,该代码要求有带有 Service Pack 4 的 Visual C++ 6.0。
请注意,我使用了与 Windows 编程界规范稍微不同的编码风格。具体说来,我使用标识符前缀 k_ 表示常数和枚举,使用 g_ 表示全局变量、静态全局变量以及静态类成员,使用 m_ 表示类成员。
构造块
Figure 1 Exception Class
class Exception
{
public:
enum ErrId
{
// Keep these in the same order as the string table:
k_critSecInitFailure,
k_threadCreationFailure,
k_threadResumeFailure,
k_threadWaitFailure
};
Exception(ErrId errId, unsigned long osErrId = NOERROR) :
m_errId(errId), m_osErrId(osErrId) {}
~Exception()
{}
UINT getErrId() const
{ return m_errId; }
unsigned long getOsErrId() const
{ return m_osErrId; }
string getErrorMsg() const;
private:
static string getOSMsg(unsigned long osErrId);
static const char*const k_messages[];
UINT m_errId;
unsigned long m_osErrId;
};
- ››Visual Basic 2008 数学函数
- ››Visual Studio2005中Smart Device的问题
- ››Visual Studio 中根据数据库字段动态生成控件
- ››Visual Studio 11全新黑色主题
- ››Visual Studio 2011 Beta新特性(一):安装VS201...
- ››Visual Studio自定义调试窗体两个小技巧
- ››Visual Studio 2005 Team Edition for Database P...
- ››Visual C#两分钟搭建BHO IE钩子
- ››Visual C++优化对大型数据集合的并发访问
- ››优化精髓之商业性网站常遇见的问题和误区
- ››大型网站的域名分布策略
- ››优化增强您的Visual C++应用程序
更多精彩
赞助商链接