#include <pthread.h>
#define NUM_THREADS 10
void *work(void *i){
int f = *((int *)(i));
printf("Hello, world from %i with value %i\n",
pthread_self(), f);
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, (void *)(&i))){
printf("Error creating the thread\n"); exit(19);}
}
return 0;
}
输出应该是:
Hello, world from 2 with value 1
Hello, world from 3 with value 2
Hello, world from 6 with value 5
Hello, world from 5 with value 5
Hello, world from 4 with value 4
Hello, world from 8 with value 9
Hello, world from 9 with value 9
Hello, world from 10 with value 9
Hello, world from 7 with value 6
Hello, world from 11 with value 10
这也不是一个功课。我在一些参考文献中遇到了一些代码,但posix不是我的领域,所以我只想要了解这一点的内容 我的问题是:
答案 0 :(得分:4)
这意味着什么
int f = *((int *)(i));
???
它将i
转换为int *
,取消引用它,并将值分配给f
。
这意味着什么
(void *)(&i))
它指向i
并将其强制转换为void *
。
pthread_create
成功返回零或非零值吗?
pthread_create
成功后返回零。
在输出中让我们以第一行为例,它是如何有价值1 !!因为我是零,所以它不应该是零
你是这么认为的,但事实并非如此。每个线程都是从所有其他线程异步执行的,并且在运行时读取i
的值,而不是在它启动时;因此,结果实际上是不可预测的。你在这里运行的程序看起来应该证明这种确切的效果。
呃......是吗?没有它,循环不会终止。
++i
会影响此输出吗?
答案 1 :(得分:1)
这意味着什么是int f = *((int *)(i));
int f = *((int *)(i));
表示将i
强制转换为int*
,然后取消引用此指针以获取该地址的int
值。您可以将其分解为两个步骤:
int *temp = (int*)i;
int f = *temp;
这是什么意思(void *)(&amp; i))
(void *)(&i)
只是将i
的地址(main
中的int*
)转换为void*
。
pthread_create成功返回零或非零值吗?
从手册页:
返回值
On success, pthread_create() returns 0; on error, it returns an error number, and the contents of *thread are undefined.
在输出中让我们以第一行为例,它是如何有价值1 !!因为我是零,所以它不应该是零
您将指向i
的指针传递给线程函数,并且由于主线程和此新线程并行运行,i
可以在for
循环中更新(++i
)在work
。
++我会影响这个输出吗?
是的,这是传递给你的线程函数的参数。它是输出中"...with value"
之后的数字。
答案 2 :(得分:0)
首先,让我们看看:
f = *((int *)(i));
由于我是void *
,因此无法在法律上取消引用,因此首先将其转换为int *
,取消引用会提供类型为int
的值。将i的地址变为空*是与此操作相反的;因为pthread函数接受void *,但是int的地址是int *类型,所以这个转换很好。
pthread_create在成功时返回零:http://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread_create.html
是的,++ i影响输出,因为它将i递增1,因此下一个调度的线程函数将作为参数提供,其值大于前一个调用的值。这就是为什么“价值”在计划期间递增的原因。