本節書摘來自異步社群出版社《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->szhostname = new char[length = strlen(szhostname) + 1];
strcpy_s(this->szhostname, length, szhostname);
this->szdatabase = new char[length = strlen(szdatabase) + 1];
strcpy_s(this->szdatabase, length, szdatabase);
this->szuserid = new char[length = strlen(szuserid) + 1];
strcpy_s(this->szuserid, length, szuserid);
this->szpassword = new char[length = strlen(szpassword) + 1];
strcpy_s(this->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 > 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 > ubufferlenght ?
ubufferlenght : szresultlength, "failed!");
size_t szresultlength = strlen("exception!") + 1;
ubufferlenght : szresultlength, "exception!");
size_t szresultlength = strlen("success") + 1;
strcpy_s(szresult, szresultlength > ubufferlenght ?
ubufferlenght : szresultlength, "success");
}<code>`</code>
4.打開<code>multithreadeddbtest.cpp</code>,并添加下面的代碼: