Multi-threaded applications and asynchronous I/O(翻译)

本文探讨了libusb库在多线程环境下的使用注意事项,特别是如何避免在等待USB传输完成时出现的竞争条件和长时间阻塞问题。介绍了libusb提供的几种机制来确保线程间正确协调,包括使用事件锁、事件等待者锁以及等待事件函数。

此文章使用Goolge进行翻译学习使用。原文网址为:http://libusb.sourceforge.net/api-1.0/mtasync.html

本文章是为了调查:(libusb_bulk_transfer()会阻塞,阻塞时间长达60s的问题)[http://blog.youkuaiyun.com/encourage2011/article/details/78760276]


libusb是一个线程安全的库,但是应用于与多线程中的libusb交互的应用程序必须要注意。

必须解决的根本问题是,所有的libusb I/O 都围绕着通过poll()/select()系统调用来监视文件描述符。这是直接暴露在异步接口,但需要着重注意的是:同步接口是在异步接口的顶部实现,因此同样的考虑适用。

问题是,如果两个或多个线程同时对libusb的文件描述符调用poll()或select(),那么当事件到达时,只有其中一个线程会被唤醒,另一个线程将完全没有意识到发生了什么事情。

考虑下面的伪代码,它提交一个异步传输,然后等待它完成。 这种风格是你可以在异步接口之上实现一个同步接口的一种方式(而且libusb也有类似的功能,尽管由于本页面所介绍的复杂性而使得它更为先进)。

void cb(struct libusb_transfer *transfer)
{
    int *completed = transfer->user_data;
     *completed = 1;
}
void myfunc() {
    struct libusb_transfer *transfer;
    unsigned char buffer[LIBUSB_CONTROL_SETUP_SIZE] __attribute__ ((aligned (2)));
    int completed = 0;
    transfer = libusb_alloc_transfer(0);
    libusb_fill_control_setup(buffer,
        LIBUSB_REQUEST_TYPE_VENDOR | LIBUSB_ENDPOINT_OUT, 0x04, 0x01, 0, 0);
    libusb_fill_control_transfer(transfer, dev, buffer, cb, &completed, 1000);
    libusb_submit_transfer(transfer);
    while (!completed) {
        poll(libusb file descriptors, 120*1000);
        if (poll indicates activity)
            libusb_handle_events_timeout(ctx, &zero_tv);
    }
    printf("completed!");
    // other code here
}

在这里,我们正在序列化一个异步事件的完成情况与某一条件相反,该条件是完成一个特定的传输。
poll()循环具有很长的超时时间,以便在没有任何事情发生的情况下(可以合理地无限制)最小化CPU使用率。

如果这是轮询libusb的文件描述符的唯一线程,则没有问题:另一个线程将不会吞下我们感兴趣的事件。另一方面,如果有另一个线程轮询相同的描述符 ,有可能会收到我们感兴趣的事件。在这种情况下,myfunc()只会意识到,在循环的下一次迭代中,传输已经完成,最多120秒后。
显然,两分钟的延迟是不可取的,甚至不能考虑使用短暂的超时来解决这个问题!

这里的解决方案是确保没有两个线程同时轮询文件描述符。一个原始的执行会影响库的能力,所以libusb提供下面的方案以确保不丢失功能。

在我们进一步讨论之前,值得一提的是,所有libusb包装的事件处理程序都完全遵循下文所述的方案。 这包括libusb_handle_events()及其相关函数以及所有同步I/O函数。libusb已把用户的头痛的事隐藏起来。


来自多个线程的libusb_handle_events()

即使只使用libusb_handle_events()和同步I/O函数,仍然可能有竞争条件。 你可能会试图用libusb_handle_events()来解决上述问题:

libusb_submit_transfer(transfer);
while (!completed) {
    libusb_handle_events(ctx);
}
printf("completed!");

然而,完成检查和libusb_handle_events()获取事件锁之间存在竞争,所以另一个线程可能已经完成了传输,导致该线程挂起,直到发生超时或其他事件。 另请参见提交6696512aade99bb15d6792af90ae329af270eba6,它在libusb的同步API实现中修复了这个问题。

修正这个竞争需要检查变量完成后才采取事件锁定,这打破了只是调用libusb_handle_events()的概念,而不必担心锁定。 这就是为什么libusb-1.0.9引入了新的
libusb_handle_events_timeout_completed()libusb_handle_events_completed()函数,它们在获取锁之后处理完成检查:

libusb_submit_transfer(transfer);
while (!completed) {
    libusb_handle_events_completed(ctx, &completed);
}
printf("completed!");

这很好地解决了我们的例子中的竞争。 请注意,如果您只想提交一个传输并等待完成,那么使用其中一个同步I/O函数就容易多了。


事件锁

问题是,当我们考虑到libusb公开文件描述符以允许将异步USB I / O集成到现有的主循环这一事实时,可以有效地让你在libusb的背后做一些工作。 如果你使用libusb的文件描述符并将它们传递给poll()/ select(),你需要知道有可能出现相关的问题。

首先要介绍的概念是事件锁。 事件锁用于序列化要处理事件的线程,以便一次只有一个线程处理事件。

在轮询libusb文件描述符之前,必须使用libusb_lock_events()来锁定事件锁定。 您必须在使用libusb_unlock_events()中止poll()/select()循环后立即释放锁。


让其他线程为你工作

尽管事件锁是解决方案的重要组成部分,但仅靠个人解决方案还不够。 你可能想知道下面是否足够…

libusb_lock_events(ctx);
while (!completed) {
    poll(libusb file descriptors, 120*1000);
    if (poll indicates activity)
        libusb_handle_events_timeout(ctx, &zero_tv);
}
libusb_unlock_events(ctx);

…而答案是,事实并非如此。 这是因为在上面显示的代码中的传输可能需要很长时间(比如30秒)才能完成,并且在传输完成之前不会释放锁定。

另一个具有类似代码的线程想要做事件处理,可能会在几毫秒后完成一次传输。 尽管有这么快的完成时间,但这个线程无法检查它的传输状态,直到上面的代码由于争用锁而结束(30秒后)。

为了解决这个问题,libusb提供了一个机制来确定另一个线程何时处理事件。 它还提供了一种机制来阻塞你的线程,直到事件处理线程完成一个事件(并且这种机制不涉及轮询文件描述符)。

在确定另一个线程正在处理事件之后,使用libusb_lock_event_waiters()获取事件等待者锁。然后重新检查其他线程是否还在处理事件,如果是,则调用libusb_wait_for_event()

libusb_wait_for_event()会让您的应用程序进入休眠状态,直到事件发生,或者直到线程释放事件锁定。当这些事情发生时,你的线程被唤醒,并且应该重新检查它正在等待的状态。它还应该重新检查另一个线程是否正在处理事件,如果没有,它应该开始处理事件本身。

伪代码如下:

retry:
if (libusb_try_lock_events(ctx) == 0) {
    // we obtained the event lock: do our own event handling
    while (!completed) {
        if (!libusb_event_handling_ok(ctx)) {
            libusb_unlock_events(ctx);
            goto retry;
        }
        poll(libusb file descriptors, 120*1000);
        if (poll indicates activity)
            libusb_handle_events_locked(ctx, 0);
    }
    libusb_unlock_events(ctx);
} else {
    // another thread is doing event handling. wait for it to signal us that
    // an event has completed
    libusb_lock_event_waiters(ctx);
    while (!completed) {
        // now that we have the event waiters lock, double check that another
        // thread is still handling events for us. (it may have ceased handling
        // events in the time it took us to reach this point)
        if (!libusb_event_handler_active(ctx)) {
            // whoever was handling events is no longer doing so, try again
            libusb_unlock_event_waiters(ctx);
            goto retry;
        }
        libusb_wait_for_event(ctx, NULL);
    }
    libusb_unlock_event_waiters(ctx);
}
printf("completed!\n");

上面代码的看来可能表明,这只能支持一个事件等待器(因此总共有2个竞争线程,另一个做事件处理),因为事件等待器似乎已经获取到事件等待锁等待事件触发。 但是,系统确实支持多个事件等待器,因为libusb_wait_for_event()实际上在等待时放下了锁,并在继续之前再次获取它。

我们现在已经实现了可以动态处理没有人处理事件的情况的代码(所以我们应该自己动手实现它),还可以处理另一个线程正在进行事件处理的情况(所以我们可以搭载它们)。 它也可以处理两者的组合,例如,另一个线程正在进行事件处理,但是无论出于何种原因,在满足条件之前停止这样做,所以我们接管事件处理。

上述伪代码中引入了四个函数。 他们的重要性应该从上面显示的代码中显而易见。

  • libusb_try_lock_events ()是一个非阻塞函数,它试图获取事件锁定,但是如果它被竞争则返回失败代码。

  • libusb_event_handling_ok()检查你的线程是否正在执行事件处理。有时候,libusb需要中断事件处理程序,这是如何检查你是否被中断的方法。如果这个函数返回0,正确的行为是让你放弃事件处理锁,然后重复这个循环。下面的libusb_try_lock_events()会失败,所以你会成为一个事件等待器。欲了解更多信息,请阅读下面的全文。

  • libusb_handle_events_locked()libusb_handle_events_timeout()的变体,你可以在保持事件锁定的情况下调用它。libusb_handle_events_timeout()本身实现了和上面类似的逻辑,所以当你“在libusb的后面工作”的时候一定不要调用它,就像这里的情况一样。

  • libusb_event_handler_active()确定是否有人正在持有事件锁。

你可能想知道为什么没有函数来唤醒在libusb_wait_for_event()上被阻塞的所有线程。这是因为libusb可以在内部执行这个操作:当有人调用libusb_unlock_events()或传输完成时(在回调完成后),它会唤醒所有这样的线程。

mysql-5.7.41-linux-glibc2.12-x86_64/bin/myisam_ftdump mysql-5.7.41-linux-glibc2.12-x86_64/bin/myisamchk mysql-5.7.41-linux-glibc2.12-x86_64/bin/myisamlog mysql-5.7.41-linux-glibc2.12-x86_64/bin/myisampack mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysql mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysql_client_test_embedded mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysql_config_editor mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysql_embedded mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysql_install_db mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysql_plugin mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysql_secure_installation mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysql_ssl_rsa_setup mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysql_tzinfo_to_sql mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysql_upgrade mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysqladmin mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysqlbinlog mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysqlcheck mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysqldump mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysqlimport mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysqlpump mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysqlshow mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysqlslap mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysqltest_embedded mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysqlxtest mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysqld-debug mysql-5.7.41-linux-glibc2.12-x86_64/lib/libmysqld-debug.a mysql-5.7.41-linux-glibc2.12-x86_64/include/mysqlx_ername.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysqlx_error.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysqlx_version.h mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysql_config mysql-5.7.41-linux-glibc2.12-x86_64/include/big_endian.h mysql-5.7.41-linux-glibc2.12-x86_64/include/binary_log_types.h mysql-5.7.41-linux-glibc2.12-x86_64/include/byte_order_generic.h mysql-5.7.41-linux-glibc2.12-x86_64/include/byte_order_generic_x86.h mysql-5.7.41-linux-glibc2.12-x86_64/include/decimal.h mysql-5.7.41-linux-glibc2.12-x86_64/include/errmsg.h mysql-5.7.41-linux-glibc2.12-x86_64/include/keycache.h mysql-5.7.41-linux-glibc2.12-x86_64/include/little_endian.h mysql-5.7.41-linux-glibc2.12-x86_64/include/m_ctype.h mysql-5.7.41-linux-glibc2.12-x86_64/include/m_string.h mysql-5.7.41-linux-glibc2.12-x86_64/include/my_alloc.h mysql-5.7.41-linux-glibc2.12-x86_64/include/my_byteorder.h mysql-5.7.41-linux-glibc2.12-x86_64/include/my_command.h mysql-5.7.41-linux-glibc2.12-x86_64/include/my_compiler.h mysql-5.7.41-linux-glibc2.12-x86_64/include/my_config.h mysql-5.7.41-linux-glibc2.12-x86_64/include/my_dbug.h mysql-5.7.41-linux-glibc2.12-x86_64/include/my_dir.h mysql-5.7.41-linux-glibc2.12-x86_64/include/my_getopt.h mysql-5.7.41-linux-glibc2.12-x86_64/include/my_global.h mysql-5.7.41-linux-glibc2.12-x86_64/include/my_list.h mysql-5.7.41-linux-glibc2.12-x86_64/include/my_sys.h mysql-5.7.41-linux-glibc2.12-x86_64/include/my_thread.h mysql-5.7.41-linux-glibc2.12-x86_64/include/my_thread_local.h mysql-5.7.41-linux-glibc2.12-x86_64/include/my_xml.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/client_authentication.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/client_plugin.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/client_plugin.h.pp mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/com_data.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/get_password.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/group_replication_priv.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/innodb_priv.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/mysql_lex_string.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/plugin.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/plugin_audit.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/plugin_audit.h.pp mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/plugin_auth.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/plugin_auth.h.pp mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/plugin_auth_common.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/plugin_ftparser.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/plugin_ftparser.h.pp mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/plugin_group_replication.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/plugin_keyring.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/plugin_keyring.h.pp mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/plugin_trace.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/plugin_validate_password.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/psi/mysql_file.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/psi/mysql_idle.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/psi/mysql_mdl.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/psi/mysql_memory.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/psi/mysql_ps.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/psi/mysql_socket.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/psi/mysql_sp.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/psi/mysql_stage.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/psi/mysql_statement.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/psi/mysql_table.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/psi/mysql_thread.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/psi/mysql_transaction.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/psi/psi.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/psi/psi_base.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/psi/psi_memory.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_command.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_locking.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_my_plugin_log.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_my_snprintf.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_mysql_alloc.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_mysql_keyring.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_mysql_password_policy.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_mysql_string.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_parser.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_rpl_transaction_ctx.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_rpl_transaction_write_set.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_rules_table.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_security_context.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_srv_session.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_srv_session_info.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_ssl_wrapper.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_thd_alloc.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_thd_engine_lock.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_thd_wait.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/service_thread_scheduler.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/services.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/services.h.pp mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/thread_pool_priv.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql/thread_type.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql_com.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql_com_server.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql_embed.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql_time.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysql_version.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysqld_ername.h mysql-5.7.41-linux-glibc2.12-x86_64/include/mysqld_error.h mysql-5.7.41-linux-glibc2.12-x86_64/include/plugin.h mysql-5.7.41-linux-glibc2.12-x86_64/include/plugin_audit.h mysql-5.7.41-linux-glibc2.12-x86_64/include/plugin_ftparser.h mysql-5.7.41-linux-glibc2.12-x86_64/include/plugin_group_replication.h mysql-5.7.41-linux-glibc2.12-x86_64/include/plugin_keyring.h mysql-5.7.41-linux-glibc2.12-x86_64/include/plugin_validate_password.h mysql-5.7.41-linux-glibc2.12-x86_64/include/sql_common.h mysql-5.7.41-linux-glibc2.12-x86_64/include/sql_state.h mysql-5.7.41-linux-glibc2.12-x86_64/include/sslopt-case.h mysql-5.7.41-linux-glibc2.12-x86_64/include/sslopt-longopts.h mysql-5.7.41-linux-glibc2.12-x86_64/include/sslopt-vars.h mysql-5.7.41-linux-glibc2.12-x86_64/include/thr_cond.h mysql-5.7.41-linux-glibc2.12-x86_64/include/thr_mutex.h mysql-5.7.41-linux-glibc2.12-x86_64/include/thr_rwlock.h mysql-5.7.41-linux-glibc2.12-x86_64/include/typelib.h mysql-5.7.41-linux-glibc2.12-x86_64/lib/libmysqlclient.a mysql-5.7.41-linux-glibc2.12-x86_64/lib/libmysqlservices.a mysql-5.7.41-linux-glibc2.12-x86_64/lib/pkgconfig/mysqlclient.pc mysql-5.7.41-linux-glibc2.12-x86_64/share/aclocal/mysql.m4 mysql-5.7.41-linux-glibc2.12-x86_64/docs/ChangeLog mysql-5.7.41-linux-glibc2.12-x86_64/docs/INFO_SRC mysql-5.7.41-linux-glibc2.12-x86_64/lib/libmysqld.a mysql-5.7.41-linux-glibc2.12-x86_64/docs/INFO_BIN mysql-5.7.41-linux-glibc2.12-x86_64/docs/INFO_SRC mysql-5.7.41-linux-glibc2.12-x86_64/docs/mysql.info mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/comp_err.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/innochecksum.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/lz4_decompress.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/my_print_defaults.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/myisam_ftdump.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/myisamchk.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/myisamlog.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/myisampack.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysql.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysql.server.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysql_config.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysql_config_editor.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysql_install_db.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysql_plugin.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysql_secure_installation.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysql_ssl_rsa_setup.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysql_tzinfo_to_sql.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysql_upgrade.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysqladmin.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysqlbinlog.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysqlcheck.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysqld_multi.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysqld_safe.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysqldump.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysqldumpslow.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysqlimport.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysqlman.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysqlpump.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysqlshow.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/mysqlslap.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/perror.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/replace.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/resolve_stack_dump.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/resolveip.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man1/zlib_decompress.1 mysql-5.7.41-linux-glibc2.12-x86_64/man/man8/mysqld.8 mysql-5.7.41-linux-glibc2.12-x86_64/LICENSE mysql-5.7.41-linux-glibc2.12-x86_64/README mysql-5.7.41-linux-glibc2.12-x86_64/bin/innochecksum mysql-5.7.41-linux-glibc2.12-x86_64/bin/lz4_decompress mysql-5.7.41-linux-glibc2.12-x86_64/bin/my_print_defaults mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysqld mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysqld_multi mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysqld_safe mysql-5.7.41-linux-glibc2.12-x86_64/bin/mysqldumpslow mysql-5.7.41-linux-glibc2.12-x86_64/bin/perror mysql-5.7.41-linux-glibc2.12-x86_64/bin/replace mysql-5.7.41-linux-glibc2.12-x86_64/bin/resolve_stack_dump mysql-5.7.41-linux-glibc2.12-x86_64/bin/resolveip mysql-5.7.41-linux-glibc2.12-x86_64/bin/zlib_decompress mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_euc-jp/char.bin mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_euc-jp/dicrc mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_euc-jp/left-id.def mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_euc-jp/matrix.bin mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_euc-jp/pos-id.def mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_euc-jp/rewrite.def mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_euc-jp/right-id.def mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_euc-jp/sys.dic mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_euc-jp/unk.dic mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_sjis/char.bin mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_sjis/dicrc mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_sjis/left-id.def mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_sjis/matrix.bin mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_sjis/pos-id.def mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_sjis/rewrite.def mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_sjis/right-id.def mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_sjis/sys.dic mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_sjis/unk.dic mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_utf-8/char.bin mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_utf-8/dicrc mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_utf-8/left-id.def mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_utf-8/matrix.bin mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_utf-8/pos-id.def mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_utf-8/rewrite.def mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_utf-8/right-id.def mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_utf-8/sys.dic mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/dic/ipadic_utf-8/unk.dic mysql-5.7.41-linux-glibc2.12-x86_64/lib/mecab/etc/mecabrc mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/adt_null.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/auth_socket.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/authentication_ldap_sasl_client.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/connection_control.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/adt_null.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/auth_socket.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/authentication_ldap_sasl_client.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/connection_control.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/group_replication.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/ha_example.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/innodb_engine.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/keyring_file.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/keyring_udf.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libmemcached.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libpluginmecab.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_framework.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_services.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_services_threaded.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_session_detach.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_session_in_thd.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_session_info.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_sql_2_sessions.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_sql_all_col_types.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_sql_cmds_1.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_sql_commit.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_sql_complex.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_sql_errors.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_sql_lock.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_sql_processlist.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_sql_replication.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_sql_shutdown.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_sql_sqlmode.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_sql_stored_procedures_functions.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_sql_views_triggers.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_x_sessions_deinit.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/libtest_x_sessions_init.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/locking_service.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/mypluglib.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/mysql_no_login.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/mysqlx.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/rewrite_example.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/rewriter.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/semisync_master.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/semisync_slave.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/test_security_context.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/test_udf_services.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/validate_password.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/debug/version_token.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/group_replication.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/ha_example.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/innodb_engine.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/keyring_file.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/keyring_udf.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libmemcached.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libpluginmecab.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_framework.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_services.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_services_threaded.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_session_detach.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_session_in_thd.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_session_info.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_sql_2_sessions.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_sql_all_col_types.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_sql_cmds_1.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_sql_commit.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_sql_complex.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_sql_errors.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_sql_lock.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_sql_processlist.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_sql_replication.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_sql_shutdown.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_sql_sqlmode.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_sql_stored_procedures_functions.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_sql_views_triggers.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_x_sessions_deinit.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/libtest_x_sessions_init.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/locking_service.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/mypluglib.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/mysql_no_login.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/mysqlx.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/rewrite_example.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/rewriter.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/semisync_master.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/semisync_slave.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/test_security_context.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/test_udf_services.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/validate_password.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/plugin/version_token.so mysql-5.7.41-linux-glibc2.12-x86_64/share/bulgarian/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/Index.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/README mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/armscii8.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/ascii.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/cp1250.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/cp1251.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/cp1256.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/cp1257.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/cp850.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/cp852.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/cp866.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/dec8.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/geostd8.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/greek.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/hebrew.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/hp8.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/keybcs2.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/koi8r.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/koi8u.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/latin1.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/latin2.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/latin5.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/latin7.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/macce.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/macroman.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/charsets/swe7.xml mysql-5.7.41-linux-glibc2.12-x86_64/share/czech/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/danish/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/dictionary.txt mysql-5.7.41-linux-glibc2.12-x86_64/share/dutch/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/english/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/errmsg-utf8.txt mysql-5.7.41-linux-glibc2.12-x86_64/share/estonian/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/fill_help_tables.sql mysql-5.7.41-linux-glibc2.12-x86_64/share/french/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/german/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/greek/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/hungarian/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/innodb_memcached_config.sql mysql-5.7.41-linux-glibc2.12-x86_64/share/italian/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/japanese/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/korean/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/mysql_security_commands.sql mysql-5.7.41-linux-glibc2.12-x86_64/share/mysql_sys_schema.sql mysql-5.7.41-linux-glibc2.12-x86_64/share/mysql_system_tables.sql mysql-5.7.41-linux-glibc2.12-x86_64/share/mysql_system_tables_data.sql mysql-5.7.41-linux-glibc2.12-x86_64/share/mysql_test_data_timezone.sql mysql-5.7.41-linux-glibc2.12-x86_64/share/norwegian-ny/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/norwegian/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/polish/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/portuguese/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/romanian/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/russian/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/serbian/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/slovak/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/spanish/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/swedish/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/share/ukrainian/errmsg.sys mysql-5.7.41-linux-glibc2.12-x86_64/support-files/mysql-log-rotate mysql-5.7.41-linux-glibc2.12-x86_64/support-files/mysqld_multi.server mysql-5.7.41-linux-glibc2.12-x86_64/lib/libmysqlclient.so mysql-5.7.41-linux-glibc2.12-x86_64/lib/libmysqlclient.so.20 mysql-5.7.41-linux-glibc2.12-x86_64/lib/libmysqlclient.so.20.3.28 mysql-5.7.41-linux-glibc2.12-x86_64/share/install_rewriter.sql mysql-5.7.41-linux-glibc2.12-x86_64/share/uninstall_rewriter.sql mysql-5.7.41-linux-glibc2.12-x86_64/support-files/magic mysql-5.7.41-linux-glibc2.12-x86_64/support-files/mysql.server
06-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值