天天看點

《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>,并添加下面的代碼: