C++ libmysqlclient竞争条件
我有多个线程需要连接到MySQL服务器的单个实例。 如果每个线程都创建并处理自己的连接,那么一切都会按预期进行。 我想实现一个简单的连接池,如下所示:C++ libmysqlclient竞争条件,c++,mysql,multithreading,C++,Mysql,Multithreading,我有多个线程需要连接到MySQL服务器的单个实例。 如果每个线程都创建并处理自己的连接,那么一切都会按预期进行。 我想实现一个简单的连接池,如下所示: void query_user(MYSQL* conn) { mysql_thread_init(); std::ostringstream query; query << "select * from user u where u.username = '" << "stack" << "'"
void query_user(MYSQL* conn)
{
mysql_thread_init();
std::ostringstream query;
query << "select * from user u where u.username = '" << "stack" << "'";
if (mysql_query(conn, query.str().c_str())) {
fprintf(stderr, "%s\n", mysql_error(conn));
exit(-1);
}
MYSQL_RES* res = mysql_use_result(conn);
MYSQL_ROW row;
while ((row = mysql_fetch_row(res)) != NULL) {
printf("%s %s %s %s %s %s %s %s %s\n",
row[0], row[1], row[2], row[3], row[4], row[5], row[6], row[7], row[8]);
}
mysql_free_result(res);
mysql_thread_end();
}
#define POOL_SIZE 2
int main(int argc, char** argv)
{
mysql_library_init(argc, argv, NULL);
// Create Connection pool
MYSQL* connection_pool[POOL_SIZE];
for (size_t i = 0; i < sizeof(connection_pool)/sizeof(MYSQL*); ++i) {
connection_pool[i] = mysql_init(NULL);
if (!mysql_real_connect(connection_pool[i], server,
user, password, database, 0, NULL, 0)) {
fprintf(stderr, "%s\n", mysql_error(connection_pool[i]));
exit(-1);
}
}
// Thread Pool
pthread_t thread_pool[POOL_SIZE];
for (size_t i = 0; i < sizeof(thread_pool)/sizeof(pthread_t); ++i) {
pthread_create(&thread_pool[i], NULL,
reinterpret_cast<void* (*)(void*)>(query_user),
(void*)&connection_pool[i]);
}
// join threads
for (size_t i = 0; i < sizeof(thread_pool)/sizeof(pthread_t); ++i) {
pthread_join(thread_pool[i], NULL);
mysql_close(connection_pool[i]);
}
mysql_library_end();
return 0;
}
void查询用户(MYSQL*conn)
{
mysql_thread_init();
std::ostringstream查询;
query我认为这有问题:
(void*)&connection_pool[i]
IMHO应:
(void*)connection_pool[i]
非常感谢,这是混乱的一部分!祝您愉快:)