WEB开发网
开发学院软件开发VC Visual C++优化对大型数据集合的并发访问 阅读

Visual C++优化对大型数据集合的并发访问

 2010-08-22 20:47:32 来源:WEB开发网   
核心提示:示例服务器程序有关示例程序的预备知识已经足够了,既提供一个实际的服务器应用程序示例,Visual C++优化对大型数据集合的并发访问(5),同时又要使其足够简单以便在一篇短文中加以介绍,这是很困难的,CD 示例采用了以下命令行参数:数据库中的项数、要执行的测试迭代的次数以及要使用的辅助线程的数目,如果指定了多个线程数目

示例服务器程序

有关示例程序的预备知识已经足够了。既提供一个实际的服务器应用程序示例,同时又要使其足够简单以便在一篇短文中加以介绍,这是很困难的,因此此处显示的示例有一点儿人为的痕迹。实际上,它根本不是一个真正的服务器应用程序。但是,我已经尝试虚构了一个可信的服务器应用程序方案,以便您能够参照实际方案来观察该应用程序,而无须运用太多的想象力。

Figure 6 Database Class

class Database
{
public:
  Database(unsigned long numEntries);
  unsigned long getNumEntries() const
    { return m_entries.size(); }
  DBEntry& getEntry(unsigned long entryId) const
    { return *m_entries.at(entryId).get(); }
private:
  typedef vector<auto_ptr<DBEntry> > DBEntryList;
  typedef DBEntryList::const_iterator DBEntryIter;
  DBEntryList m_entries;
};
class DBEntry
{
public:
  DBEntry(unsigned long id, const string& value) :
    m_id(id), m_value(value) {}
  unsigned long getId() const
    { return m_id; }
  const char* getValue() const
    { return m_value.c_str(); }   // use of c_str causes cloning
  void setValue(const string& newValue)
    { m_value = newValue.c_str(); } // use of c_str causes cloning
  static void critSecMode(bool useSingleCritSec)
    { g_useSingleCritSec = useSingleCritSec; }
  void acquire();
  void release();
private:
  unsigned long    m_id;
  string       m_value;
  static bool     g_useSingleCritSec;
  static CritSec   g_singleCritSec;
  static CritSecTable g_critSecTable;
};

示例 ConcurrencyDemo(或简称为 CD)模拟了简单的内存中数据库。DBEntry 类(参见图 6)代表该数据库中的一个项,由一个数值键和一些文本组成。客户端可以读取与给定键关联的文本,也可以更新特定键的文本。对象个数在启动时确定。

CD 示例包含一个辅助线程池。在实际情况下,这些线程将通过某种远程调用机制(如 TCP、DCOM、IIOP 或 SOAP — 如果您恰好正在使用尖端技术的话)获得来自客户端的请求。在该示例中,请求的生成经过了模拟,而不是真实的。

CD 示例采用了以下命令行参数:数据库中的项数、要执行的测试迭代的次数以及要使用的辅助线程的数目。如果指定了多个线程数目,则该程序将用每个数目运行一次测试。

Figure 7 main

typedef vector<unsigned long>    NumberList;
typedef NumberList::const_iterator NumberIter;
int main(int argc, char* argv[])
{
  try
  {
    // Interpret command-line arguments:
    unsigned long numEntries;
    unsigned long numIterations;
    NumberList numThreadsList;
    interpretCommandLine(argc, argv, numEntries, numIterations,
      numThreadsList);
    // Initialize the in-memory database:
    Database db(numEntries);
    // Print output header:
    cout <<
      "
"
      "# of DB entries:," << numEntries << "
"
      "# of iterations:," << numIterations << "
"
      "All times in milli-seconds
"
      "
"
      "# Threads,Time (Single CritSec),Time (CritSec Table)"
      << flush;
    // Run a test for each number of threads:
    for (NumberIter i = numThreadsList.begin();
      i != numThreadsList.end(); i++)
    {
      cout << '
' << *i;
      DBEntry::critSecMode(true);   // single critical section
      doTest(db, numIterations, *i);
      DBEntry::critSecMode(false);  // critical section table
      doTest(db, numIterations, *i);
    }
    cout << endl << endl;
  }
  catch (const Exception& e)
  {
    cout << e.getErrorMsg() << endl << endl;
  }
  catch (const exception& e)
  {
    cout << "std::exception: " << e.what() << endl << endl;
  }
  return 0;
}

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:Visual 优化 大型

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接