如果 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());
}
答案 0 :(得分:1)
pthread_join()用于等待终止由线程ID 指定的线程。这是必需的,这样进程就不会在线程完成执行之前退出。
该线程由线程ID标识。现在,如果您将0作为线程ID,它将找不到该线程并立即返回错误。
因此,如果您使用0作为创建的所有线程的线程ID,则在这些线程完成分配的工作之前,该过程可能会退出。
在我的系统中,如果我给0作为线程ID,它将返回错误号3(ESRCH找不到具有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 以获得有关线程的更多信息。