天天看点

《C++多线程编程实战》——2.8 线程的用法include "stdafx.h"include "CMySQL.h"

本节书摘来自异步社区出版社《c++多线程编程实战》一书中的第2章,第2.8节,作者: 【黑山共和国】milos ljumovic(米洛斯 留莫维奇),更多章节内容可以访问云栖社区“异步社区”公众号查看。

现在大部分应用程序都使用一些数据库。在许多情况下,这种应用程序通常会运行在不同的pc中,并同时进行读写操作。下面例子中的线程使用了mysql数据库。

准备就绪

该示例要求安装mysql c connector,详情请查阅附录。成功安装mysql c connector后,运行运行visual studio。

操作步骤

1. 创建一个新的默认c++控制台应用程序,命名为<code>multithreadeddbtest</code>。

2.打开【解决方案资源管理器】,添加一个新的头文件,命名为<code>cmysql.h</code>。打开<code>cmysql.h</code>,并输入下面的代码:

cmysql* cmysql::mysqlinstance = null;

cmysql cmysql::createinstance(char szhostname, char* szdatabase,

  char szuserid, char szpassword)

{

  if (mysqlinstance)

  {

    return mysqlinstance;

  }

  return new cmysql(szhostname, szdatabase, szuserid, szpassword);

}

void cmysql::releaseinstance()

    delete mysqlinstance;

cmysql::cmysql(char szhostname, char szdatabase, char* szuserid,

 char* szpassword)

  size_t length = 0;

  this-&gt;szhostname = new char[length = strlen(szhostname) + 1];

  strcpy_s(this-&gt;szhostname, length, szhostname);

  this-&gt;szdatabase = new char[length = strlen(szdatabase) + 1];

  strcpy_s(this-&gt;szdatabase, length, szdatabase);

  this-&gt;szuserid = new char[length = strlen(szuserid) + 1];

  strcpy_s(this-&gt;szuserid, length, szuserid);

  this-&gt;szpassword = new char[length = strlen(szpassword) + 1];

  strcpy_s(this-&gt;szpassword, length, szpassword);

cmysql::~cmysql()

  delete szhostname;

  delete szdatabase;

  delete szuserid;

  delete szpassword;

bool cmysql::connectinstance()

  mysql* mysqllink = null;

  try

    mysqlconnection = mysql_init(null);

    mysqllink = mysql_real_connect(mysqlconnection, szhostname,

      szuserid, szpassword, szdatabase, 3306, null, 0);

  catch (...)

    mysqlconnection = 0;

    return false;

  return mysqllink ? true : false;

bool cmysql::disconnectinstance()

    mysql_close(mysqlconnection);

    return true;

bool cmysql::readdata(char szquery, char szresult, size_t ubufferlenght)

  int mysqlstatus = 0;

  mysql_res* mysqlresult = null;

  mysql_row mysqlrow = null;

  my_ulonglong numrows = 0;

  unsigned numfields = 0;

    mysqlstatus = mysql_query(mysqlconnection, szquery);

    if (mysqlstatus)

    {

      return false;

    }

    else

      mysqlresult = mysql_store_result(mysqlconnection);

    if (mysqlresult)

      numrows = mysql_num_rows(mysqlresult);

      numfields = mysql_num_fields(mysqlresult);

    mysqlrow = mysql_fetch_row(mysqlresult);

    if (mysqlrow)

      if (!mysqlrow[0])

      {

        mysql_free_result(mysqlresult);

        return false;

      }

      mysql_free_result(mysqlresult);

    size_t szresultlength = strlen(mysqlrow[0]) + 1;

    strcpy_s(szresult, szresultlength &gt; ubufferlenght ?

    ubufferlenght : szresultlength, mysqlrow[0]);

      mysqlresult = null;

  return true;

bool cmysql::writedata(char szquery, char szresult, size_t

  ubufferlenght)

    int mysqlstatus = mysql_query(mysqlconnection, szquery);

      size_t szresultlength = strlen("failed!") + 1;

      strcpy_s(szresult, szresultlength &gt; ubufferlenght ?

      ubufferlenght : szresultlength, "failed!");

    size_t szresultlength = strlen("exception!") + 1;

    ubufferlenght : szresultlength, "exception!");

  size_t szresultlength = strlen("success") + 1;

  strcpy_s(szresult, szresultlength &gt; ubufferlenght ?

  ubufferlenght : szresultlength, "success");

}<code>`</code>

4.打开<code>multithreadeddbtest.cpp</code>,并添加下面的代码: