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