#include <pthread.h>
#define NUM_THREADS 4
void *work(void *i){
printf("Hello, world from %i\n", pthread_self());
pthread_exit(NULL);
}
int main(int argc, char **argv){
int i;
pthread_t id[NUM_THREADS];
for(i = 0; i < NUM_THREADS; ++i){
if(pthread_create(&id[i], NULL, work, NULL)){
printf("Error creating the thread\n"); exit(19);
}
}
printf("After creating the thread. My id is: %i\n",
pthread_self());
return 0;
}
我知道输出是:
Hello, world from 2
Hello, world from 3
After creating the thread. My id is: 1
Hello, world from …
首先,这不是作业。 POSIX不是我的领域,所以我只想要输出的解释(不需要解释因为我知道他们做了什么而使用的函数)一些快速的答案:
++i
使用了......它是否以某种方式影响了输出?答案 0 :(得分:4)
++i
与输出无关。pthread_join
线程,main
函数(以及程序)在最后一个线程执行之前退出。答案 1 :(得分:1)
for(i = 0; i < NUM_THREADS; i++) { pthread_join(id[i], NULL); }
4.Threads与主线程并行启动。因此,您启动的每个线程的代码在启动后与主线程的代码同时执行。这意味着当子线程正在执行其工作时,主线程继续执行printf
,因此输出以“随机”方式交错。
答案 2 :(得分:1)
3&amp; 4:线程是异步的:使用pthreads,当你退出main函数时,所有线程都会终止,无论它们是否已经完成。
因此在main退出循环之前只打印了3个线程,在main的print语句和返回之间打印了1个,并且一个线程没有那么远。
答案 3 :(得分:0)
pthread_self不会返回数字类型,而是 opaque类型 pthread_t
(可能是一些不透明的struct
)。
我建议您使用
清除阵列 memset(id, 0, sizeof(id));
的确,在GNU / Linux / Debian / Sid / x86-64上,内部包含文件/usr/include/x86_64-linux-gnu/bits/pthreadtypes.h
已经
typedef unsigned long int pthread_t;
但我认为你不应该相信它是一个线程的标识,只是一个不透明的句柄(就像文件描述符一样)。
我建议你阅读一篇关于pthreads的好教程,例如:布莱斯巴尼this one
在今天的多核机器上,线程[可能]在不同核心上并行运行。