1

如果 pthreadId 在 Android 上的pthread_join(pthreadId, NULL)中为零会发生什么 ?就像下面的代码片段:

pthread_join(0, NNULL);
4

1 回答 1

1

pthread_join() 用于等待线程 id指定的线程终止。这是必需的,以便进程在线程完成执行之前不应该退出。

线程由线程 id 标识。现在如果你给 0 作为线程 id,它将找不到线程并立即返回错误。

因此,如果您使用 0 作为创建的所有线程的线程 ID,则可能在线程完成分配的工作之前,该进程可能会退出。

在我的系统中,如果我将 0 作为线程 id,它会返回错误号 3(ESRCH 找不到具有该 ID 线程的线程。)

几点:

  • 您可以打印线程 ID 并检查通常为线程 ID 提供的值以更好地理解它。
  • 您可能需要线程 id 的抽象类型来打印其值。请在 /usr/include/.../pthreadtypes.h 中搜索以获取 pthread_t 的抽象类型。在我的系统中,它的unsigned long int

    /usr/include/x86_64-linux-gnu/bits/pthreadtypes.h:typedef unsigned long int         pthread_t;
    
  • 在使用 GDB 进行调试时,它为每个线程分配线程号。线程旁边是由 pthread_create 分配的线程 ID。对于线程号 1,线程 ID 为 0x7f5750718740。

    (gdb) info threads
      Id   Target Id         Frame 
    * 1    Thread 0x7f5750718740 (LWP 9215) "a.out" 0x00007f57502f2d2d in         __GI___pthread_timedjoin_ex (
        threadid=140012979980032, thread_return=0x0, abstime=0x0, block=<optimized         out>) at pthread_join_common.c:89
      2    Thread 0x7f574fef8700 (LWP 9216) "a.out" __lll_lock_wait ()
        at ../sysdeps/unix/sysv/linux/x86_64/lowlevellock.S:135
    

有关线程的更多信息,请查看Tech Easy

于 2018-10-11T12:57:33.467 回答