• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:スレッドのスケジューリングポリシーと優先順位の設定(pthread))

マルチスレッドのプログラミングでのスレッドの優先順位変更方法について

このQ&Aのポイント
  • マルチスレッドのプログラミングをする上で、pthread(スレッド)の優先順位の変更方法について教えてください。
  • また、メインのスレッドの優先順位も変更したいのですが、方法を教えてください。
  • 現在は、pthread_attr_setschedpolicy関数を使用して優先順位を変更していますが、思ったように変更できていないようです。

質問者が選んだベストアンサー

  • ベストアンサー
  • terra5
  • ベストアンサー率34% (574/1662)
回答No.1

OSは明記した方がいいでしょう。 また、各関数には戻り値があって、エラーが起きているかどうか判定できる物もあるはずですから、 戻り値はプログラム上で必ず確認してください。 エラーがあるかないかで話も違ってきますし。 また、変更されていない気がしますとありますが、 どうやって確認しましたか。 これもOSによって違ってくると思いますが。 また、プライオリティ制御はOSによってはルート権限が無いとできない操作もあります。 あとは、各スレッドの内容が問題になる場合もありますし、ライブラリ等は専用のマルチスレッド用の物を使わないといけない場合もあります。 ということで、現状ではよくわかりません(^^; これでも良く見るとわかるかも知れませんが、 補足が来てから考えます。

hiromichel
質問者

補足

ご返答有難うございます。説明不足で申し訳ありませんでした。 おかげ様でrootの権限で行うと出来るということがわかりました。 OSはRedHatLinux7.1Jです。現在はrootでは無いところで実行してました。 プログラムは、通信を行うもので、メインのスレッドでは受信処理、 別スレッドでは、インターバルタイマによるタイマの測定を行っており、タイムアップ通知をメインスレッドにsocketにて通知するというものです。 処理の高速化をはかるために優先度としては、 タイマを優先し、メインも優先度を上げたい状況でした。 確認は、setschedparamによる優先度設定の前と後でgetshcedparamを 行い、値をチェックするという方法でやっていました。すべての戻り値は0で、成功と表示されてました。 私が値が変わっていないを言ったのは、どうやらgetchedparamの戻り値を見ていたようでした…。 大変早とちりしてしまって申し訳ありません。 どうも有難うございました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • スレッドの作成について(pthread_create関数)

    以下のプログラムをLinuxで実行するとpthread_create関数の戻り値が『1』となり、errno変数には『4』が入ってしまいます。(どちらにも『0』が入っててほしい) 何がやりたいのかというと、子スレッドのプライオリティを優先指定にして、子スレッドが生成されることを確認したいだけなのですが。。。 (下のプログラムじゃきっと本質的には確認できたことにはならないとおもいますが。。。) 何故pthread_create関数の戻り値が『1』となり、errno変数には『4』が入ってしまうかわかる方、どなたかご教授願えませんでしょうか? -------------------------------ここから------------------------------- #include <pthread.h> #include <errno.h> void *test2( void * ); int main ( int argc, char **argv ) { int iThCreateRes=0; pthread_attr_t t_attr; int bRet=0; pthread_t szThreadHandle; errno = 0; pthread_attr_init( &t_attr ); pthread_attr_setdetachstate( &t_attr, PTHREAD_CREATE_JOINABLE ); pthread_attr_setschedpolicy( &t_attr,SCHED_RR ); pthread_attr_setinheritsched( &t_attr, PTHREAD_EXPLICIT_SCHED ); pthread_attr_setscope( &t_attr, PTHREAD_SCOPE_PROCESS ); iThCreateRes = pthread_create( &szThreadHandle, &t_attr, test2, (void *)777 ); if( iThCreateRes == 0 ) { } return ( bRet ); } void *test2( void *iParam ) { return (void*)0; } -------------------------------ここまで-------------------------------

  • スレッドの優先順位に関して

    ただ今、黒本(徹底攻略 Java2 プログラマ問題集 Platform5.0 対応) を使用しSJC-Pの勉強をしているんですが、スレッドの20番目の問題が どうしてもわからないので質問させて下さい。 下記の問題なんですが コンパイルし実行した結果として正しい物を選ぶという 問題で、答えは「 B A B A B A と表示される」になります。 class MyThread extends Thread{ MyThread(String name){ super(name); } public void run(){ System.out.println(getName()); for(int i=0;i<2;i++){ try{ sleep(1000); }catch(Exception e){} yield(); System.out.println(getName()); }}} class T20{ public static void main(String[] args){ Thread t1 = new MyThread("A"); t1.setPriority(1); t1.start(); Thread t2 = new MyThread("B"); t2.setPriority(10); t2.start(); } } この問題の答えの解説で 優先順位を指定すると必ず高い優先順位のスレッドから 実行が開始するみたいな事が書かれてて、おかしいと思い、 検証してみたところ、私の環境では、結果が何通りも表示されました。 yield()についても私の持っている別の参考書には 「現在実行中のスレッドオブジェクトを実行可能状態に戻し、 他のスレッドに実行できるようにする。ただし優先順位の関係で実行中だったスレッドが再度実行される可能性もある。」 と書かれていて上記の答えに納得が出来ていません。 スレッドの優先順位とyieldに関して お手数ですが、アドバイスよろしくお願いします。

    • ベストアンサー
    • Java
  • pthread_attr_tへの値の代入について

    スレッドを作成する際に、 属性としてPTHREAD_CREATE_DETACHEDを指定したいのですが、 その際pthread_attr_tをどのように設定したらよいかわかりません。 現在書いているコードは pthread pt; pthread_attr_t* attr; pthread_attr_init(attr); pthread_attr_setdetachstate(attr,PTHREAD_CREATE_DETACHED); if (pthread_create(&pt,attr,NULL,NULL) != 0){ perror("thread_create()"); exit(1); } 上記のようなものです。(スレッド作成部分のattr以外の 引数は適当です) これでコンパイルすると 警告: 変数 attr には値が代入されていません. と、警告が出てしまいます。 これを解消するにはどう修正したらよいのでしょうか?

  • SSISの優先順位制約の設定がうまくいかない

    SSISの優先順位制約について、 http://msdn.microsoft.com/ja-jp/library/ms140153.aspx を参照しながら設定してみたのですが、どうもうまく出来ません。。 やりたい事としては、 select count(*) as cnt from TABLE 上記クエリにてテーブルデータ件数を取得し、 0件でなければ次のコンテナの処理に移す、といったものです。 手順としては、以下を試しました。 ------------------------------------- ≪SQL実行タスク コンテナの設定≫ ▼全般タブ  ▽SQLステートメント   ・SQLSourceType:直接入力   ・SQLStateMent:select count(*) as cnt from TABLE  ▽結果セット   ・ResultSet:単一行 ▼結果セットタブ  ・結果名:@cnt  ・変数名:新しい変数にて、以下の設定を実施   ・コンテナ:パッケージ全体を選択   ・名前:変数   ・名前空間:User   ・値の型:Int32 や String で実施   ・値:0(Int32の場合) や cnt(Stringの場合) ≪優先順位制約エディタの設定≫ ▼制約オプション  ・評価操作:式と制約  ・値:成功  ・式:@cnt > 0 ------------------------------------- 全く検討違いな設定をしているとは思うのですが、 設定自体は可能で、いざ実行させると以下のエラーが表示されます。 「@cnt > 0 は True または False に評価される必要があります」 優先順位制約について、文献がほとんど見つけられなかったため、 この件についてご存知の方がいらっしゃいましたら、 何卒、ご教授のほどよろしくお願い申し上げます。

  • pthread質問があります

    devc++を使ってpthreadの勉強をしてます pthread-win32 packageをinstall して実行をしたのですがerrorがでます 何の理由か分かりません 教えてください [Linker error] undefined reference to `_imp__pthread_attr_init' [Linker error] undefined reference to `_imp__pthread_attr_getscope' [Linker error] undefined reference to `_imp__pthread_attr_setscope' [Linker error] undefined reference to `_imp__pthread_create' [Linker error] undefined reference to `_imp__pthread_join' [Linker error] undefined reference to `_imp__pthread_exit' ld returned 1 exit status #include <pthread.h> #include <stdio.h> #define NUM_THREADS 5 void *runner(void *param); int main(int argc, char *argv[]) { int i, scope; pthread_t tid[NUM_THREADS]; pthread_attr_t attr; //get the default attributes pthread_attr_init(&attr); //first inquire on the current scope if(pthread_attr_getscope(&attr,&scope) != 0) fprintf(stderr, "Unable to get scheduling scope\n"); else { if(scope == PTHREAD_SCOPE_PROCESS) printf("PTHREAD_SCOPE_PROCESS"); else if(scope == PTHREAD_SCOPE_SYSTEM) printf("PTHREAD_SCOPE_SYSTEM"); else fprintf(stderr, "Illegal scope value.\n"); } //set the scheduling algorithm to PCS or SCS pthread_attr_setscope(&attr, PTHREAD_SCOPE_SYSTEM); //create the threads for(i=0;i<NUM_THREADS;i++) pthread_create(&tid[i],&attr,runner,NULL); //now join on each thread for(i=0;i<NUM_THREADS;i++) pthread_join(tid[i],NULL); getchar(); getchar(); return 0; } //each thread will begin control in this function void *runner(void *param) { //do some work pthread_exit(0); }

  • 別ターミナルへのprintf出力

    LinuxでC言語プログラムから新しいターミナルを開き、そこにprintfで文字を出力したいのですがどうやったら良いのでしょうか?下記プログラムを作ってみましたが、新しいターミナルが開くだけで文字が出力されません #include <pthread.h> #include <stdio.h> #include <unistd.h> #include <signal.h> void* thread(void* arg) {  int pid=0;  pid = fork();  if(pid==0)  {    execlp("gnome-terminal","gnome-terminal",NULL);     printf("Hello World!!\n");  } } int main() {   pthread_t th;  void* result;   pthread_create(&th, NULL,thread, NULL);  pthread_join( th,&result); }

  • 主キーソート(キーの優先順位をつけてソート)

    時刻から生成した乱数を、構造体「TEST」のメンバ変数 a, b, c に代入し、 メンバb を基準にして、昇順にクイックソートしてみます。 #include <stdio.h> #include <stdlib.h> #include <time.h> typedef struct{ int a; int b; int c; }TEST; int comp( const void *c1, const void *c2 ); int main(void) { int i; TEST base[10]; /* 乱数の生成 */ srand( (unsigned int)time( NULL ) ); for( i=0; i<10; i++ ){ base[i].a = rand() % 100; /* 0~99の乱数 */ base[i].b = rand() % 100; base[i].c = rand() % 100; printf( "%d¥t", base[i].a ); printf( "%d¥t", base[i].b ); printf( "%d¥t", base[i].c ); printf( "¥n" ); } /* TEST構造体のbを基準にソート */ printf( "¥n--TEST構造体のbを基準にソート--¥n¥n" ); qsort( base, 10, sizeof(TEST), comp ); /* ソート後のデータを表示 */ for( i=0; i<10; i++ ){ printf( "%d¥t", base[i].a ); printf( "%d¥t", base[i].b ); printf( "%d¥t", base[i].c ); printf( "¥n" ); } return 0; } /* 比較関数 */ int comp( const void *c1, const void *c2 ) { TEST test1 = *(TEST *)c1; TEST test2 = *(TEST *)c2; int tmp1 = test1.b; /* b を基準とする */ int tmp2 = test2.b; return tmp1 - tmp2; } ランダム結果 13 22 21 63 21 45 52 45 81 75 67 94 7 1 44 81 66 38 35 24 35 62 6 4 76 12 84 86 77 71 --TEST構造体のbを基準にソート-- 7 1 44 62 6 4 76 12 84 63 21 45 13 22 21 35 24 35 52 45 81 81 66 38 75 67 94 86 77 71 と、このように表示されます。 下段の真ん中の列を見ると、メンバ変数 b で並び替えられている事が分かります。 比較関数comp内では、TEST構造体でキャストしてから、bを取り出しています。 また、戻り値に「tmp1 - tmp2」を使うことで、 「a < b :負の値、a == b :0、 a > b :正の値」という条件に当てはめています。 とhttp://simd.jugem.jp/?eid=116で書かれていますが これはb列を基準にしたソートであり、a列とc列の優先順位は書かれていません キーの優先順位をb>a>cにするにはどうしたらよいでしょうか。 もっとたくさんキーあった時(a>b>c>d>e>f>g・・・)のようにキーの優先順位つけて昇順or降順にデータをソートしたいです。 よろしくお願いします

  • 【C言語】if文内の演算子の優先順位について

    【C言語】if文内の演算子の優先順位について こんにちわ。初めて質問を投稿させて頂きます。 宜しくお願い致します。 【環境】 OS:Windows XP(SP3) コンパイラ:Visual C++ 6.0 CPU:AMD Athlon X2 4200+ 【質問】 私は下記のプログラムを実行しました --------------------------------- 【プログラム】 #include <stdio.h> int main( void ) { int i = 1; int j = 2; printf( "i = %d\n",i ); printf( "j = %d\n",j ); if( (i = 0) && (j = 200) == 200 ){ printf( "\n(1)-----------------------------\n" ); printf( "i = %d\n",i ); printf( "j = %d\n",j ); } printf( "\n(2)-----------------------------\n" ); printf( "i = %d\n",i ); printf( "j = %d\n",j ); return 0; } 【出力結果】 i = 1 j = 2 (2)----------------------------- i = 0 j = 2 //(※) --------------------------------- 私は【出力結果】(2)のj = 2という出力結果(上記(※)の行)は j = 200にならないとおかしいと思っております。 なぜなら、私は【プログラム】内のif文「if( (i = 0) && (j = 200) == 200 )」 の判定手順が下記の様になると考えているからです。  (1)i = 0を実行  (2)j = 200を実行  (3)(i = 0)の判定実行   →判定の結果「0」なので&&の右側の判定「(j = 200) == 200」    を行うまでも無くif文全体の判定がFALSE。 しかし、実際は「j = 200」が実行されてないので、上記(2)と(3)の 判定手順が逆転している様に見えます。 C言語の優先順位を見ると「&&」や「==」よりも「()」の方が高いと 記憶してるので、(2)→(3)の順に実行されないとおかしいと思ってます。 しかし、私の予想した結果と実際の出力結果が異なるので私の演算子の優先順位 やif文内での判定手順の理解に間違いがあると考えています。 出来ましたらどの点が間違っているのかご教授願えませんでしょうか? 宜しくお願い申し上げます。

  • 条件変数を用いた有限バッファ問題を考えています。

    皆さんこんにちは。 当方、プログラミングを勉強中の学生です。 条件変数を用いた有限バッファ問題を考えております。 以下に示すソースにおいて、関数produce()は1から1000までの整数を順に生成し、関数consume()はバッファから取り出した値の合計(1から1000までの和、500500となる)を求めるようプログラミングしているつもりなのですが、コンパイルして実行すると思ったような結果となりません。 どこが間違っているかご教授いただければ幸いです。 よろしくお願い致します。 以下、ソースとなります。 #include <stdio.h> #include <pthread.h> #define N 5 int buffer[N]; int inptr = 0, outptr = 0; int count = 0; int i = 0; int j = 0; int sum = 0; pthread_cond_t full = PTHREAD_COND_INITIALIZER; pthread_cond_t empty = PTHREAD_COND_INITIALIZER; pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; int produce (void) { i += 1; return i; } void consume (int x) { j += 1; sum += x; } void *producer(void *arg) { int data; for (;;) { if (i >= 1000) break; data = produce(); pthread_mutex_lock(&lock); while (count > N) pthread_cond_wait(&full, &lock); count = count + 1; buffer[inptr] = data; inptr = (inptr + 1) % N; pthread_mutex_unlock(&lock); pthread_cond_signal(&empty); } } void *consumer(void *arg) { int data; for (;;) { if (j >= 1000) break; pthread_mutex_lock(&lock); while (count == 0) pthread_cond_wait(&empty, &lock); count = count - 1; data = buffer[outptr]; outptr = (outptr + 1) % N; pthread_mutex_unlock(&lock); pthread_cond_signal(&full); consume(data); } } int main() { pthread_t a, b; pthread_create(&a, NULL, producer, NULL); pthread_create(&b, NULL, consumer, NULL); pthread_join(a, NULL); pthread_join(b, NULL); printf("sum = %d\n", sum); return 0; }

  • ゼロ交差法でプログラミングをしたのですが、

    ゼロ交差法でプログラミングをしたのですが、 http://www11.atpages.jp/~matsu4512/flex/Image_Process/srcview/source/Edge_extract.as.html /* th : 閾値 scale : 本来は分散。だが任意の値を指定できるようにしている msize : フィルタの配列の大きさ msize*msizeの大きさ */ これらの値を一体どのように設定すればよいのか悩んでいます。 適当に、 double scale=200; double th=128; int msize=1; などと実験しているのですが、一向に、エッジ検出ができません。 使っている画像は、240×320 とやや小さめの画像です。 一般的に、 th : 閾値 scale : 本来は分散。だが任意の値を指定できるようにしている msize の値はどのように設定すればよいのでしょうか?