2010-04-13 49 views
1

Iam新增了c编程,需要一些帮助。posix pthreads in c

long *taskids[NUM_THREADS]; 

for(t=0; t<NUM_THREADS; t++) 
{ 
    taskids[t] = (long *) malloc(sizeof(long)); 
*taskids[t] = t; 
    printf("Creating thread %ld\n", t); 
    rc = pthread_create(&threads[t], NULL, PrintHello, (void *) taskids[t]); 
    ... 
} 

此代码片段演示了如何将简单整数传递给每个线程。调用线程为每个线程使用一个唯一的数据结构,确保每个线程的参数在整个程序中保持不变。 Iam不能理解这是怎么发生的,有人可以解释它?

+0

如果您不熟悉C编程,可能会有比pthread更复杂的开始位置。 – WhirlWind 2010-04-13 01:29:45

+0

你从哪里找到这段代码片段? – clahey 2010-04-13 01:33:25

+0

https://computing.llnl.gov/tutorials/pthreads/#PthreadsAPI – Jony 2010-04-13 01:38:01

回答

2

该代码正在做什么是存储指向已分配数据的指针数组。每个线程都分配了很长的空间,然后传递一个指向该值的指针。这给了线程一个工作的地方,主线程仍然可以访问。

这可以用少一点的分配来实现:

long taskids[NUM_THREADS]; 

for(t=0; t<NUM_THREADS; t++) 
{ 
    taskids[t] = t; 
    printf("Creating thread %ld\n", t); 
    rc = pthread_create(&threads[t], NULL, PrintHello, (void *) &taskids[t]); 
    ... 
} 

虽然这并降低灵活性,从而释放TaskID的。它还要求这个函数在所有线程完成之前不会返回。

+0

我其实不喜欢这段代码。该功能不返回的要求是脆弱的。原文更可取,因为它没有太多的失败潜力。 – clahey 2010-04-13 22:44:03

3
  • malloc分配足够的内存来保存一个长整数。它返回一个长指针,一个long*
  • long*存储到taskids[t],以便它可以稍后使用。
  • pthread_create被调用。其中一个参数是要传递给新线程的值。
    • 由于pthread_create函数不知道程序员想要传递什么样的值,所以它使用一个void*,它可以是指向任何东西的指针。 taskids[t]是指向一个长整数的指针。它被投射(这是(void *))到一个空指针并作为参数给予pthread_create
  • pthread_create创建一个新的线程,并调用PrintHello函数并传递空隙指针taskids[t]作为值到PrintHello
  • 一旦PrintHello开始,它会将void指针转换回长指针,然后它可以访问包含其taskid的长整数。