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

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

ただいまの
回答率

88.10%

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,845

score -13

下記のコードはスレッド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;
}
...
以上宜しくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • mattn

    2017/08/22 13:40 編集

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

    キャンセル

  • mattn

    2017/08/22 14:02

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

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/08/22 14:40 編集

    画像でコードの編集方法を載せたので参考にして下さい。 https://teratail.com/questions/89161

    キャンセル

回答 2

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/22 14:06

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

    キャンセル

  • 2017/08/22 14:19

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

    キャンセル

  • 2017/08/22 14:26

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

    キャンセル

  • 2017/08/22 14:32

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

    キャンセル

check解決した方法

-2

//スレッドの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のコアー数より、スレッドの数が少ない時は効果なし
//======================================
以上、メモとして書いておきます。
回答有難う御座いました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る