質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

3860閲覧

C/C++のスレッドの実行時間について

nqf27650

総合スコア115

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/08/22 04:00

編集2017/08/22 04:39

下記のコードはスレッドFuncAとFuncBの内部ループを10000000回
実行して、その時間を測定表示するものです。
尚、FuncAとFuncBのプライオリティはそれぞれ、99と1です。

Q1)FuncAとFuncBの実行時間は、共に約1.7秒位で変わりがありません。
つまり、プライオリティの差が出ないようです。
この件に関しまして、コメント頂けますと大変有りがたいです。

...
..#include <pthread.h>
..#include <stdio.h>
..#include <stdlib.h>
..#include <unistd.h>
..#include <errno.h>
..#include <string.h>
..#include <time.h>
..#include <math.h>

..#define REPEAT 10000000

void *FuncA(void *arg);
void *FuncB(void *arg);

int main(){

pthread_attr_t *tattrA;
pthread_attr_t *tattrB;

/*
do{
if( (tattr=(pthread_attr_t *)malloc(sizeof(pthread_attr_t)) )==NULL){
printf("Couldn't allocate memory for attribute object\n");
}
} while(tattr==NULL);
*/

tattrA=(pthread_attr_t *)malloc(sizeof(pthread_attr_t)); tattrB=(pthread_attr_t *)malloc(sizeof(pthread_attr_t)); pthread_t tidA; pthread_t tidB; struct sched_param paramA; struct sched_param paramB; int pr,error,i; int policy=SCHED_FIFO;//1 if(error=pthread_attr_init(tattrA)){ printf("A:Attribute initialization failed with error %s\n",strerror(error)); } if(error=pthread_attr_init(tattrB)){ printf("B:Attribute initialization failed with error %s\n",strerror(error)); } //pthread_attr_setschedpolicy error = pthread_attr_setschedpolicy(tattrA, policy); if (error != 0) printf("A:failed to set policy\n"); //================= error = pthread_attr_setschedpolicy(tattrB, policy); if (error != 0) printf("B:failed to set policy\n"); scanf("%d",&pr); paramA.sched_priority=pr; error=pthread_attr_setschedparam(tattrA,&paramA); if(error!=0) printf("A:failed to set priority\n"); //=========== paramB.sched_priority=1; error=pthread_attr_setschedparam(tattrB,&paramB); if(error!=0) printf("B:failed to set priority\n"); pthread_create(&tidA,tattrA,FuncA,tattrA); pthread_create(&tidB,tattrB,FuncB,tattrB); pthread_join(tidA,NULL); pthread_join(tidB,NULL); printf("pthread_join was done\n"); free(tattrA); free(tattrB); printf("All threads terminated\n"); return 0;

}

void *FuncA(void *arg){
printf("FunA is running\n");
pthread_attr_t *tattr=(pthread_attr_t *)arg;
int state,error;

int policy; struct sched_param param; //display_thread_sched_attr("=====get plicy and priority==="); error=pthread_attr_getdetachstate(tattr,&state); if(error==0 && state==PTHREAD_CREATE_DETACHED){ printf(" My state:A is DETACHED\n"); } else if(error==0 && state==PTHREAD_CREATE_JOINABLE){ printf(" My state:A is JOINABLE\n"); }

//error=pthread_attr_getschedpolicy(tattr,&param);
error=pthread_attr_getschedpolicy(tattr,&policy);
if(error==0){
printf(" My Policy:A is %d\n",policy);
}

error=pthread_attr_getschedparam(tattr,&param);

if(error==0){ printf(" My Priority:A is %d\n",param.sched_priority); }

//=============
clock_t c1,c2;
c1 = clock();
//=============
double dwk;
for(int i=0; i<REPEAT; i++){
dwk=sin((double)i);
}
//=================
c2 = clock();
printf("time:A = %f[s]\n", (double)(c2-c1)/CLOCKS_PER_SEC);
//=================
fflush(stdout);

printf("FunA is finished\n"); return NULL;

}

void *FuncB(void *arg){
printf("FunB is running\n");
pthread_attr_t *tattr=(pthread_attr_t *)arg;
int state,error;

int policy; struct sched_param param; //display_thread_sched_attr("=====get plicy and priority==="); error=pthread_attr_getdetachstate(tattr,&state); if(error==0 && state==PTHREAD_CREATE_DETACHED){ printf(" My state:B is DETACHED\n"); } else if(error==0 && state==PTHREAD_CREATE_JOINABLE){ printf(" My state:B is JOINABLE\n"); }

//error=pthread_attr_getschedpolicy(tattr,&param);
error=pthread_attr_getschedpolicy(tattr,&policy);
if(error==0){
printf(" My Policy:B is %d\n",policy);
}

error=pthread_attr_getschedparam(tattr,&param);

if(error==0){ printf(" My Priority:B is %d\n",param.sched_priority); }

//=============
clock_t c1,c2;
c1 = clock();
//=============
double dwk;
for(int i=0; i<REPEAT; i++){
dwk=sin((double)i);
}
//=================
c2 = clock();
printf("time:B = %f[s]\n", (double)(c2-c1)/CLOCKS_PER_SEC);
//=================
fflush(stdout);

printf("FunB is finished\n"); return NULL;

}
...
以上宜しくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mattn

2017/08/22 04:02

読めないのでコードブロックを使って下さい。コードの前と後ろの行に ``` を入れて下さい。(質問する側のエチケットです)
mattn

2017/08/22 04:05 編集

読みにくい質問は回答者の負担になります。やり方が分からないのであればお伝えしますよ。いったんカテゴリに沿わないですが低評価を付けさせてもらいました。改善されたら外します。
nqf27650

2017/08/22 04:08

>やり方が分からないのであればお伝えしますよ。 <ーーお願いします
tamy

2017/08/22 04:11

> コードの前と後ろの行に ``` を入れて下さい。
mattn

2017/08/22 04:11

コードの始まり「.#include <pthread.h>」の1行上と、最後の行「以上宜しくお願いします」の前の行にそれぞれ ``` (これだけの行)を差し込んで下さい。
mattn

2017/08/22 04:22

編集のやり方が分からないという事でしょうか?
mattn

2017/08/22 04:40 編集

... ではなく ``` です。コピーしてお使い下さい。その際、# の前に入れて頂いている .. も不要ですので削除下さい。
mattn

2017/08/22 05:02

編集するの難しいですか?それとも編集しないのは意地か何かですか?
guest

回答2

0

割り当て可能なコア数に余裕があれば、低優先のスレッドも待つことなく実行できちゃうんですけど...実際のとこどうだったんですか?

投稿2017/08/22 04:55

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nqf27650

2017/08/22 05:06

>割り当て可能なコア数に余裕があれば、低優先のスレッドも待つことなく実行できちゃうんですけど...実際のとこどうだったんですか? <---2coreですから、同時にrunするスレッド増加してみます。
episteme

2017/08/22 05:19

(いっこだけ高優先で)スレッド増やして有意な差が出れば効果アリってことで。
nqf27650

2017/08/22 05:26

同時に3スレッド(FuncA,FuncB,FuncC)ランしましが、その処理時間は 全て略同じでした。 FuncA,FuncBはPriorityは99で、FuncC=1としました。 Policy=SCHED_FIFOとかSCHED_RRとしました。 よって、このコードではpriorityの設定は出来ないようです。 コードに不具合があるかも知れません。
episteme

2017/08/22 05:32

clock()で時間測定してるんか...clock()はwall-clockよね? スレッド毎の処理時間を計測できるん?
guest

0

自己解決

//スレッドのpriorityとpolicyの設定方法
//下記の1..6)項を満足して、policyとPriorityの設定が出来る。
//1)スレッドの中で、policyとPriorityの設定が必要である
//2)スレッドの起動側では、pthread_attr_xxx命令を使用し、
//3)起動側されたスレッド内では、attrの無いpthread_xxx命令を使用する。
//4)プログラムは、sudoの権限で実行する必要がある。
//5)CPUのコアー数より、スレッドの数が多い時に適用される。
// SCHED_FIFI SCHED_OTHER SCHED_OTHER <--SCHED_OTHERは変更せず。
// threadA:18ms threadB:28ms threadC:28ms
//6)CPUのコアー数より、スレッドの数が少ない時は効果なし
//======================================
以上、メモとして書いておきます。
回答有難う御座いました。

投稿2017/08/22 11:28

nqf27650

総合スコア115

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問