以下のスレッドを用いて配列a[]の合計値を求めるプログラムについて質問したいのですが
(1)pthread_createで実行させる関数はvoid *で宣言しなければいけないのでしょうか? ポインタの部分は理解できますが、voidの理由が特に理解できないです。
(2)pthread_joinで受け取れる値の型はvoidである理由がよくわかりません。
(3)関数calcの引数もvoidの意味がわかりません。calc(arg_t *arg)ではなぜいけないのですか。
(4)sum += (int)(unsigned long)ret;などの2回キャストしているのはどういう意味になるのでしょうか。sumがint型なので(int)だけすればいいと思いました。
ご教示願います。
C
1include <stdio.h> 2#include <stdlib.h> 3#include <unistd.h> 4#include <pthread.h> 5 6typedef struct { 7 int start; 8 int end; 9} arg_t; 10 11int a[10] = {-1, 23, -34, 45, 5, 6, 7, 8, 9, 10}; 12int sum = 0; 13 14void *calc(void *arg) { 15 int i, s= 0; 16 arg_t * argp = (arg_t *)arg; 17 for(i=argp->start;i<=argp->end; i++) { 18 sum+=a[i]; 19 } 20 return (void *)(unsigned long)s; 21} 22 23int main(void) { 24 pthread_t thread; 25 arg_t arg1, arg2; 26 void *ret; 27 28 arg1.start=0; arg1.end=4; 29 pthread_create(&thread, NULL, calc, &arg1); 30 31 arg2.start=5; arg2.end=9; 32 sum += (int)(unsigned long)calc(&arg2); 33 pthread_join(thread, &ret); 34 sum += (int)(unsigned long)ret; 35 printf("sum=%d\n", sum); 36 return 0; 37} 38

回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/08/05 17:48