gpt4 book ai didi

c - 取消线程后如何杀死所有使用 pthread_create 创建的子进程?

转载 作者:太空宇宙 更新时间:2023-11-04 07:31:35 24 4
gpt4 key购买 nike

我有以下代码,我制作ps aux | myprogram(我构建的应用程序的名称)的 main() 代码的每个步骤中的 grep myprogram

在开始执行myprogram 时,ps aux | grep myprogram 只显示列表中 myprogram 的 1 次

取消我在 main() 开始时创建的线程后,ps aux | grep myprogram 显示 myprogram 两次,我预计只得到 1 个。

有人可以解释这种行为吗?以及如何回到初始状态(只有1个myprogram)

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

pthread_t test_thread;

void *thread_test_run (void *v)
{
int i=1;
while(1)
{
printf("into thread %d\r\n",i);
i++;
sleep(1);
}
return NULL
}

int main()
{
// ps aux | grep myprogram ---> show only 1 myprogram

pthread_create(&test_thread, NULL, &thread_test_run, NULL);

// ps aux | grep myprogram ---> show 3 myprogram

sleep (20);


pthread_cancel(test_thread);

// ps aux | grep myprogram ---> show 2 myprogram and I expected only 1 !!??

// other function are called here...

return 0;
}

编辑

linux使用的libc是libc-0.9.30.1.so

# ls -l /lib/| grep libc
-rwxr-xr-x 1 root root 16390 Jul 11 14:04 ld-uClibc-0.9.30.1.so
lrwxrwxrwx 1 root root 21 Jul 30 10:16 ld-uClibc.so.0 -> ld-uClibc-0.9.30.1.so
lrwxrwxrwx 1 root root 21 Jul 30 10:16 libc.so.0 -> libuClibc-0.9.30.1.so
-rw-r--r-- 1 root root 8218 Jul 11 14:04 libcrypt-0.9.30.1.so
lrwxrwxrwx 1 root root 20 Jul 30 10:16 libcrypt.so.0 -> libcrypt-0.9.30.1.so
-rw-r--r-- 1 root root 291983 Jul 11 14:04 libuClibc-0.9.30.1.so

最佳答案

我假设您有一些过时的 glibc(版本 2.2 或 2.3),它使用了 pthread 的“linuxthreads”实现。

在这个较旧的库中,库创建了一个额外的线程用于线程管理;它可以在第一次调用 pthread_create 后创建;但大部分时间它会休眠。

在较新的 Linux 中,有带有 NPTL(“本地 posix 线程库”)实现的 glibc。使用的时候,在ps axu中是看不到线程的;使用 ps axum(与 m)查看 native 线程。并且 NPTL 不使用管理线程。

PS 检查 http://pauillac.inria.fr/~xleroy/linuxthreads/faq.html D.5 答案:

D.5: When I'm running a program that creates N threads, top or ps display N+2 processes that are running my program. What do all these processes correspond to?

Due to the general "one process per thread" model, there's one process for the initial thread and N processes for the threads it created using pthread_create. That leaves one process unaccounted for. That extra process corresponds to the "thread manager" thread, a thread created internally by LinuxThreads to handle thread creation and thread termination. This extra thread is asleep most of the time.

PPS:谢谢,Mohamed KALLEL;谢谢,mux:libc-0.9.30.1 是 uClibc,它似乎使用相同的过时的 linuxthreads 实现(已知不完全兼容 posix)。这是变更日志:http://web.archive.org/web/20070609171609/http://www.uclibc.org/downloads/Changelog

0.9.10 21 March 2002

Major new features: o pthreads support (derived from glibc 2.1.3's linuxthreads library) by Stefan Soucek and Erik Andersen

关于c - 取消线程后如何杀死所有使用 pthread_create 创建的子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13290306/

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