我无法在c中执行pthreads程序。请告诉我以下程序有什么问题。我既没有得到任何错误也没有预期的输出。
void *worker(void * arg)
{
int i;
int *id=(int *)arg;
printf("Thread %d starts\n", *id );
}
void main(int argc, char **argv)
{
int thrd_no,i,*thrd_id,rank=0;
void *exit_status;
pthread_t *threads;
thrd_no=atoi(argv[1]-1);
thrd_id= malloc(sizeof(int)*(thrd_no));
threads=malloc(sizeof(pthread_t)*(thrd_no));
for(i=0;i<thrd_no;i++)
{
rank=i+1;
thrd_id[i]=pthread_create(&threads[i], NULL, worker, &rank);
}
for(i=0;i<thrd_no;i++)
{
pthread_join(threads[i], &exit_status);
}
}
答案 0 :(得分:1)
thrd_no = atoi(argv[1] - 1);
可能不符合您的意图; argv
通常传递到新进程并解析为C数组的方式argv[1] - 1
可能指向\0
(具体而言,\0
位于argv[0]
1}})。 (更一般地说,从字符串的开头向后索引很少是正确的。)结果是atoi()
将返回0并且不会创建任何线程。你到底打算做什么?
答案 1 :(得分:0)
您将相同的地址&rank
传递给每个帖子,因此id
和*id
对您的所有worker
- s都相同。
您最好在堆上分配传递给每个工作例程的地址。
您可能还包括<stdint.h
并使用intptr_t
,例如
void worker (void* p)
{
intptr_t rk = (intptr_t) p;
/// etc
}
并致电
intptr_t rank = i + 1;
thrd_id[i]=pthread_create(&threads[i], NULL, worker, (void*)rank);
你应该学习使用调试器并编译所有警告和调试信息,即gcc -Wall -g
(并改进你的代码,直到它没有警告,然后使用gdb
)
答案 2 :(得分:0)
代码段等级= i + 1; thrd_id [i] = pthread_create(&amp; threads [i],NULL,worker,&amp; rank);
会产生竞争条件。