0

我正在看这段代码:

/* 04-join.c

Simple illustration of dividing work among two threads

pthread.h should be first otherwise compile with -D_THREAD_SAFE 
*/
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

typedef struct {
   int *ar;
   long n;
   int id;
   int sum;
} subarray;


void *incer(void *arg) {
  long i;
   int id = ((subarray*)arg)->id;

   printf("Start thread: %d sum=%ld\n",id, ((subarray*)arg)->sum);
   for (i = 0; i < ((subarray*)arg)->n; i++) {
      ((subarray*)arg)->ar[i]++;
      ((subarray*)arg)->sum++;
   }
   printf("Terminating thread: %d sum=%ld\n",id, ((subarray*)arg)->sum);
   pthread_exit(NULL);
}

int main() {
   int ar[1000000];
   pthread_t th1, th2;
   subarray sb1, sb2;

   sb1.ar = &ar[0];
   sb1.n  = 500000;
   sb1.id = 1;
   sb1.sum = 0;
   pthread_create(&th1, NULL, incer, &sb1);

   sb2.ar = &ar[500000];
   sb2.n  = 500000;
   sb2.id = 2;
   sb2.sum = 0;
   pthread_create(&th2, NULL, incer, &sb2);

   pthread_join(th1, NULL);
   pthread_join(th2, NULL);
   printf("Terminating main: %d sum=%d\n",getpid(),sb1.sum+sb2.sum);
   pthread_exit(NULL);
   return 0;
}

我的问题是,在 for 循环中的函数 incer 中。我们有一段代码

((subarray*)arg)->ar[i]++;

在子数组中,结构 ar 是一个指向整数的指针,对吗?那么 ar[i]++ 有什么作用呢?为什么要这样做?它是在模拟这个线程的“完成的工作”,同时增加总和吗?

还有一个小问题。incer前面的“void *”的目的是什么?我错过了关于 void * 的重要性的部分。

是不是意味着,这个指针指向了incer函数的地址。并且通过创建函数创建了一个名为“incer”的void *,我们可以在创建线程时使用它来引用这段代码,所以它知道要执行这段代码吗?

另外,为什么要使用 pthreads?进程线程?

4

1 回答 1

0

Incer 被声明为 void* 的返回类型允许它在退出时返回一个值,然后通过 pthread_join'ing 线程检索该值。返回值可能必须在堆上分配并强制转换为 (void*)。在这种情况下,线程没有返回任何值,并且主进程不期望返回值,因为 pthread_join 正在使用 NULL 参数调用。

ar 可以是指向单个整数的指针,但也可以是指向整数数组的指针。在这种情况下,它是一个整数数组。

((子数组*)arg)->ar[i]++; 将索引 i 处的整数加 1。

于 2012-10-03T03:53:16.180 回答