关于C中POSIX线程的问题
首先,这不是家庭作业。 POSIX不是我的领域,因此我只想对输出进行解释(无需解释所使用的函数,因为我知道它们的作用),快速回答以下问题:关于C中POSIX线程的问题,c,multithreading,concurrency,pthreads,posix,C,Multithreading,Concurrency,Pthreads,Posix,首先,这不是家庭作业。 POSIX不是我的领域,因此我只想对输出进行解释(无需解释所使用的函数,因为我知道它们的作用),快速回答以下问题: 系统是否指定了pthreads(2、3、1)的ID 使用的++i。。。它是否以某种方式影响了输出 为什么最后只有4个线程(3+main)为什么不是5个 为什么主要是在印刷后创作。。。。执行了另一个线程??!!怎么会呢 它们是当前进程内线程的ID 不,i不会影响输出,因为您不会将其作为参数传递给线程,也不会从线程代码内部访问它。因此,它只是一个循环变量 我不知
++i
。。。它是否以某种方式影响了输出for(i=0;i
4.线程与主线程并行启动。因此,您正在启动的每个线程的代码在启动后与主线程的代码同时执行。这意味着主线程在子线程执行其工作时继续执行
printf
,因此输出以“随机”方式交错。3&4:线程是异步的:对于pthreads,当您退出主函数时,所有线程都将终止,无论它们是否已完成
因此,在main退出循环之前,只有3个线程打印,1个线程在main的print语句和return之间打印,而一个线程没有打印到那么远
++i
与输出无关pthread\u加入
线程,因此main
函数(以及程序)在执行最后一个线程之前退出 for(i = 0; i < NUM_THREADS; i++)
{
pthread_join(id[i], NULL);
}
实际上,在GNU/Linux/Debian/Sid/x86-64上,内部包含文件/usr/include/x86\u 64-Linux-GNU/bits/pthreadtypes.h
memset(id, 0, sizeof(id));
但我不认为您应该相信它是线程的标识,只是一个不透明的句柄(就像文件描述符一样)
我建议你读一本关于pthreads的好教程,比如Blaise Barney的
在今天的多核机器上,线程[可能]在不同的核上并行运行。我记得pthread\u t实际上在不同的平台上定义不同。我认为在某些平台(Windows)上,它实际上是一个结构。所以要小心,pthread\u t不透明对象也是darwin(Mac OS X和iOS)上的一个结构。仅仅假设它是一个整数是不好的。第四点:你是说我不能预测输出的确切顺序吗?@Armagadon:没错。线程由操作系统打开和关闭CPU,因此它们的指令是随机交错的。不,你不能。你甚至可以在理论上把单个角色混在一起…所以你也说我不能预测确切的数字outcome@Armagadon不,你不能预测确切的结果。@Armagadon正确,你不能预测结果。事实上,如果你运行程序几次,结果可能会发生很大的变化。很好的总结,但就#1而言,pthread\u t
类型甚至不再必须是算术类型,因此它们不必从1开始递增:有可能预测这个精确的输出吗?不,不可能,从一个程序运行到下一个程序,输出是不可复制的。。。
for(i = 0; i < NUM_THREADS; i++)
{
pthread_join(id[i], NULL);
}
memset(id, 0, sizeof(id));
typedef unsigned long int pthread_t;