#include #include #include class AutoMysqlLibraryDeinit { public: AutoMysqlLibraryDeinit() { mysql_library_init(0, nullptr, nullptr); } ~AutoMysqlLibraryDeinit() { mysql_library_end(); } }; class AutoMysqlClose { public: AutoMysqlClose(MYSQL* pCon) : m_pCon(pCon) {} ~AutoMysqlClose() { if(m_pCon) { mysql_close(m_pCon); m_pCon = nullptr; } } private: MYSQL* m_pCon; }; std::mutex mut; std::ofstream out("$errors.txt", std::ios::app); void MyThreadFunction() { auto* pCon = mysql_init(nullptr); if(!pCon) { std::lock_guard oLock(mut); out << "Failed mysql_init" << std::endl; return; } AutoMysqlClose amc(pCon); auto* pCon2 = mysql_real_connect(pCon, "localhost", "root", "", "pstest", 3306, nullptr, CLIENT_MULTI_STATEMENTS); if(pCon != pCon2) { std::lock_guard oLock(mut); out << "Failed mysql_real_connect" << std::endl; return; } const char szQuery[] = "CALL pstest_procedure()"; const size_t nLen = strlen(szQuery); for(int i = 0; i < 100; ++i) { const auto nRes = mysql_real_query(pCon, szQuery, nLen); if(nRes) { const char* szErr = mysql_error(pCon); std::lock_guard oLock(mut); out << szErr << std::endl; continue; } do { auto* pRes = mysql_store_result(pCon); mysql_free_result(pRes); }while(mysql_next_result(pCon)); } } long Run() { AutoMysqlLibraryDeinit amld; std::vector vecThreads; const size_t nThreads = 20; vecThreads.reserve(nThreads); for(size_t i = 0; i < nThreads; ++i) { vecThreads.emplace_back(std::thread(MyThreadFunction)); } for(auto& oThread : vecThreads) { oThread.join(); } return 0; } int main() { Run(); return 0; }