2012-04-22 124 views
0

我无法在c中执行pthreads程序。请告诉我以下程序有什么问题。我既没有收到任何错误,也没有预期输出。以下pthread程序有什么问题?

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); 
    } 
} 
+2

呃,其中一个,你的程序会建立尽可能多的警告,因为它有行。考虑添加一些包含并整理警告;编译器很擅长告诉你有关令人讨厌的惊喜,你应该注意它的警告。 – zmccord 2012-04-22 07:15:02

回答

1

thrd_no = atoi(argv[1] - 1);可能不会做你想要的; argv通常被传递到一个新的进程并解析成一个C数组,argv[1] - 1可能指向\0(具体地说,\0argv[0]的末尾)。 (更一般地说,从字符串的开头向后索引很少正确)。结果是atoi()将返回0,并且不会创建线程。你打算在那里做什么?

+0

我想创建no。的线程等于一个小于一个。由用户输入。 – Aps 2012-04-22 07:27:08

+0

这将是'atoi(argv [1]) - 1'。同样考虑到如果用户传递非数字或'0'会发生什么,但是,由于缺少错误检查。 – geekosaur 2012-04-22 07:28:09

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

0

代码段rank = i + 1; thrd_id [i] = pthread_create(& threads [i],NULL,worker,& rank);

会产生竞争状态。