我想创建三个线程并将一个整数传递给每个线程。我用pthread_create,我的代码如下。如何在使用pthread_create时传递参数
#include<pthread.h>
#include<unistd.h>
#include<stdio.h>
#define NUM_OF_JOB 3
void* doJob(void* arg){
int i = *((int*)arg);
printf("%d\n",i);
}
void init_job() {
pthread_t thread[NUM_OF_JOB];
int index[NUM_OF_JOB]={-1,-1,-1};
for(int i=0;i<NUM_OF_JOB;i++){
pthread_create(&thread[i],NULL,doJob,(void*)(&index[i]));
}
}
int main(){
init_job();
sleep(1);
return 0;
}
我打算传递-1到每个线程的,但运行服务器时间的代码后,我发现,它并没有打印方式中三-1。相反,他们可能会产生奇怪的结果。那为什么呢?
类似的代码可以在 pass arguments to the pthread_create function 我找不到他的代码和我的代码有什么不同。但是在他的代码中,线程可以得到预期的参数。
非常感谢你:)
顺便说一句,我试图改变从上面的链接一点点的代码,it.surprisingly跑,我mordified版本没有任何产生预期的效果。(我想每个线程应该获得自己的唯一整数作为参数) 这是我的调和代码。任何人都可以解释吗?
#include <stdio.h>
#include <pthread.h>
#define THREAD_NUM 10
void *thread_func(void *arg)
{
int v = *(int*)arg;
printf("v = %d\n", v);
return (void*)0;
}
int main(int argc, const char *argv[])
{
pthread_t pids[THREAD_NUM];
int rv;
int i;
for (i = 0; i < THREAD_NUM; i++) {
rv = pthread_create(&pids[i], NULL, thread_func, (void*)(&i));
if (rv != 0) {
perror("failed to create child thread");
return 1;
}
}
for (i = 0; i < THREAD_NUM; i++) {
pthread_join(pids[i], NULL);
}
return 0;
}
再次谢谢:)
第二个问题与第一个不同,变量'i'不会超出范围。 –
@JoachimPileborg谢谢。 – 2501
谢谢,但在原始链接中,代码如下: 'pthread_create(&pids [i],NULL,thread_func,(void *)(i));' 并在** thread_func **中,它使用int ** v =(int)arg **,结果是正确的。为什么没有数据竞赛? 此外,该代码使用gcc编译,但使用g ++,不允许从void *转换为int,因此如何将这段代码与我的cpp代码整合在一起? :) – Casualet