如果在Android的pthread_join(pthreadId,NULL)中pthreadId为零,会发生什么?

时间:2018-10-10 07:25:14

标签: android-ndk pthreads pthread-join

如果 pthread_join(pthreadId,NULL)中的pthreadId为零,将会发生什么  在Android上?类似于以下代码片段:

    public static void Run()
    {
        Func<int, string> fn = n =>
        {
            var sleep = n * 2000;
            Thread.Sleep(sleep);
            return n + ", " + sleep;
        };

        var opts = new ExecutionDataflowBlockOptions
        {
            MaxDegreeOfParallelism = 4
        };

        var transformBlock = new TransformBlock<int, string>(fn, opts);
        var bufferBlock = new BufferBlock<string>(opts);

        transformBlock.LinkTo(bufferBlock, new DataflowLinkOptions { PropagateCompletion = true });

        for (var i = 3; i > 0; i--)
            transformBlock.Post(i);

        Console.WriteLine(bufferBlock.Receive());
        Console.WriteLine(bufferBlock.Receive());
        Console.WriteLine(bufferBlock.Receive());
    }

1 个答案:

答案 0 :(得分: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 以获得有关线程的更多信息。