我正在看这段代码:
/* 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]++;
在subarry中struct ar是一个指向整数的指针,对吗?那么ar [i] ++做了什么?为什么要这样做?它是否通过这个线程模拟“完成的工作”,同时增加总和?
还有一个小问题。 incer前面“void *”的目的是什么?我错过了关于void *的重要性的部分。
这是否意味着,此指针指向incer函数的地址。通过创建函数,创建一个名为“incer”的void *,我们可以在创建线程时使用它来引用这段代码,所以它知道执行这段代码吗?
另外,为什么pthreads?处理线程?
答案 0 :(得分:0)
使用返回类型void *声明的Incer允许它在退出时返回一个值,然后由pthread_join'ing线程检索。返回值可能必须在堆上分配并转换为(void *)。在这种情况下,线程没有返回值,并且主进程不期望返回值,因为使用NULL参数调用pthread_join。
ar可以是指向单个整数的指针,但它也可以是指向整数数组的指针。在这种情况下,它是一个整数数组。
((子阵列*)ARG) - &GT; AR [I] ++;将索引i处的整数递增1。