gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:13:05 24 4
gpt4 key购买 nike

我正在尝试将 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com