c - QEMU 用户模式模拟退出时是否会阻止 pthread_join 阻塞?

标签 c multithreading pthreads qemu system-calls

我正在尝试将 QEMU 的用户模式模拟器作为我正在编写的较大程序中的线程运行。我修改了 linux-user/main.c 文件,以便现在调用标准 int main(int argc, char **argv, char **envp 函数void *qemu_user_mode_func(void *arg)。我还在该函数的末尾添加了 pthread_exit(NULL),这是 pthread 的标准做法(或者所以我'已被告知)。

但是,当我尝试运行包含我自己的测试函数的第二个线程(如下面的 void *test_func(void *arg) 所示)时,进程会在第二个线程完成之前退出,甚至调用 pthread_join(tid),我读过它会阻塞调用线程,直到线程 tid 返回。 QEMU 的用户模式模拟退出是否会阻止 pthread_join 退出,或者我只是使用了错误的线程?

这是我的代码(不包括大部分 qemu_user_mode_func):

void *qemu_user_mode_func(void *arg)
{
    thread_data_t *thread_data;
    int argc;
    char **argv;
    char **envp;

/** QEMU's normal code **/

    //return 0;
    pthread_exit(NULL);
}

void *test_func(void *arg) {
    struct timespec time;
    time.tv_sec = 7;
    time.tv_nsec = 0;

    nanosleep(&time, NULL);

    printf("hello, world - from a thread\n");
    pthread_exit(NULL);
}

int main(int argc, char**argv, char **envp) {
    //Initialize variables to create thread
    int rc;
    pthread_t threads[2];
    thread_data_t main_args;

    main_args.tid = 1;
    main_args.argc = argc;
    main_args.argv = argv;
    main_args.envp = envp;

    //Create thread
    if ((rc = pthread_create(&(threads[0]), NULL, test_func, NULL))) {
        fprintf(stderr, "error: pthread_create, rc: %d\n", rc);
        return EXIT_FAILURE;
    }

    if ((rc = pthread_create(&(threads[1]), NULL, qemu_user_mode_func, (void *)&main_args))) {
        fprintf(stderr, "error: pthread_create, rc: %d\n", rc);
        return EXIT_FAILURE;
    }

    //Wait for thread to finish, then terminate process
    for (rc = 0; rc < 2; rc++) {
        pthread_join(threads[rc], NULL);
    }

    return 0;
}

编辑:我在void cpu_loop(CPUX86State *env)函数中发现,当模拟程序到达结论时,QEMU调用系统调用231,它是sys_exit_group (根据 1 )。所以我猜测这个系统调用正在终止我正在运行的整个进程。如果有任何关于如何解决这个问题的提示,我将不胜感激!

最佳答案

如果您将复杂的现有应用程序转换为线程,则会出现问题。一是应用程序可以调用 exit 或其变体,这将终止整个程序。还有许多其他问题可能会导致问题。我建议使用gdb to determine what is making your program exit .

关于c - QEMU 用户模式模拟退出时是否会阻止 pthread_join 阻塞?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31076889/

相关文章:

multithreading - 线程是否在虚假唤醒时持有相应的互斥体?

c - 以编程方式获取线程 CPU 时间的方法,在 C 中,适用于 OpenSolaris 和 Linux

c - 数组未在 if 语句 C 内更新

c - 如何访问字符数组的第一个字符?

c - 了解矩阵 c 的分配

java - 并发问题 - 从 Java 多线程服务器下载的同一文件的大小不同

c++ - 数据结构的线程安全,在哪里添加同步原语?

c++ - Windows 临界区公平性

c# - 在 WinForms 线程上使用 CoInitializeEx

c# - 当发出同步 I/O 调用时,当前线程 (C#) 的 ThreadState 是什么?