代码之家  ›  专栏  ›  技术社区  ›  Manuel Salvadores

posixapi调用列出进程中运行的所有pthread

  •  18
  • Manuel Salvadores  · 技术社区  · 14 年前

    我在POSIX/Linux环境中有一个多线程应用程序—我无法控制创建pthreads的代码。在某个时刻,进程(pthreads的所有者)接收到一个信号。

    该信号的处理程序应该中止、取消或停止所有pthreads,并记录运行的pthreads数量。

    3 回复  |  直到 8 年前
        1
  •  23
  •   Community CDub    7 年前

    似乎没有任何可移植的方法来枚举进程中的线程。

    pthread_kill_other_threads_np ,这看起来像是原始纯userland pthreads实现的遗留问题,可能会像今天所描述的那样工作,也可能不会。它不会告诉你有多少线程。

    你可以通过查看 /proc/self /proc/123 ). 尽管许多unice都有一个同名的文件或目录,但布局完全不同,因此任何使用unice的代码 /proc 将是特定于Linux的。文件 Documentation/filesystems/proc.txt /proc/self/task 每个线程都有一个子目录。子目录的名称是LWP id;不幸的是, [1] [2] [3] 似乎没有一种方法可以将LWP id与pthread id关联起来(但是您可以用pthread id获得自己的线程id) gettid(2) /过程/自我/任务 不是原子的;线程的数量可以通过 /proc/self/status (当然,在你采取行动之前它可能会改变)。

    如果您不能用从Linux pthreads获得的有限支持实现您想要的,另一种策略是使用动态链接技巧来提供您自己的版本 pthread_create 它会记录到一个数据结构中,您可以在以后进行检查。

        2
  •  0
  •   sarnold    14 年前

    你可以包起来 ps -eLF (或者另一个更精确地读取您感兴趣的进程的命令)并读取 NLWP 列以了解有多少线程正在运行。

        3
  •  -5
  •   MarkR    14 年前

    然而,这样做不会是无争用条件的,除非它得到了适当的管理(或者您只从一个线程创建和连接线程)。

    当然,如果您计划退出进程,您可以让线程继续运行,因为调用exit()会终止所有线程。

    请记住,一个健壮的应用程序无论如何都应该是崩溃安全的,因此您不应该依赖于关闭行为来避免数据丢失等。