#!/usr/bin/env /friends/bin/cscript #include #include #include #include #include #define N 25 #define ARRAYN 21 int16_t number[ARRAYN]; void *part_sum(void *n){ int32_t result; printf(u8"Thread %"PRId8" is now running!\n",*((int8_t *)n)); for(int16_t i = 1;i <= ARRAYN/N+1;i++){ result = result+number[*((int8_t *)n)+1+N*(i-1)]; //スレッド番号+1+スレッド数*(項番号-1),ARRAYNは1始まり. } return (void *)result; } int main(void){ int8_t errorc,errorj,arg[N] = {0}; //生成時・スレッドの終了の待機時,のエラーチェック・スレッド番号. int32_t psum[N]={0},sum = 0; for(int8_t i = 1;i <= ARRAYN-1;i++){ number[i] = 2*i-1; //{1,3,5,7,9,…} } pthread_t thread[N]; //スレッド型変数の宣言? //スレッド生成 for(int8_t i = 0;i <= N-1;i++){ arg[i] = i; errorc = pthread_create(&thread[i],NULL,part_sum,&arg[i]); //第3引数に処理する関数,第4引数にスレッドに渡す変数を指定する. if(errorc != 0){ puts(u8"Failed New Thread Creating."); return 1; } } //スレッドの処理が終わるまで待つ. for(int8_t i = 0;i <= N-1;i++){ errorj = pthread_join(thread[i],(void *)&psum[i]); //第2引数にスレッドから貰う変数を指定する. if(errorj != 0){ puts(u8"Failed New Thread Joining."); return 1; } } puts(u8"Partial sum"); for(int8_t i = 0;i <= N-1;i++){ printf(u8"%"PRId32"\n",psum[i]); sum = sum+psum[i]; } puts(u8"SUM"); printf(u8"%"PRId32"\n",sum); puts(u8"Terms"); for(int8_t i = 1;i <= ARRAYN-1;i++){ printf(u8"%d ",number[i]); } return 0; }