Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ libmysqlclient竞争条件_C++_Mysql_Multithreading - Fatal编程技术网

C++ libmysqlclient竞争条件

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" << "'"

我有多个线程需要连接到MySQL服务器的单个实例。 如果每个线程都创建并处理自己的连接,那么一切都会按预期进行。 我想实现一个简单的连接池,如下所示:

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]

非常感谢,这是混乱的一部分!祝您愉快:)