• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:Linuxでスレッド優先度って変えられますか?[pthread C/C++])

Linuxでスレッド優先度を変更する方法とは?

このQ&Aのポイント
  • Suse Linux 10を使用して、C++でスレッド(pthread)を用いたプログラムを作っています。スレッド優先度を設定する必要がありますが、一般ユーザでは優先度が効かないようです。super userでログインした場合には効果があるようです。一般ユーザとsuper userで優先度が異なる理由は何でしょうか?
  • スレッドの優先度を変更する方法について詳しく教えてください。
  • 一般ユーザでもスレッドの優先度は変更できるのでしょうか?どなたか詳しい方がいらっしゃいましたら、教えてください!

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

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

> ただ、シンプルにスレッド作成時に優先度設定できればいいんですがね。。。 スレッド作成時に指定したければpthread_attr_setschedparamを使えば良いですが、本質的には同じことです。内部ではsched_setscheduler(2)を使うでしょうから権限による制限は同じです。 # http://www.linux.or.jp/JM/html/glibc-linuxthreads/man3/pthread_attr_setschedparam.3.html

参考URL:
http://www.linux.or.jp/JM/html/glibc-linuxthreads/man3/pthread_attr_setschedparam.3.html
goopon
質問者

補足

そういうことなんですか。 内部では同じことなんですね。 その割りに余り権限による制限について打ち出した情報がなかったので、一般ユーザでも優先度↑ができるのかな~と思ってました。

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

その他の回答 (1)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

pthread_setschedparam等を使ってリアルタイムスケジューリングポリシーを設定するという話なら、Linuxのリアルタイムスケジューリングポリシーは基本的にはスーパーユーザしか使えません。 ただ最近のカーネルではあらかじめリソース制限 RLIMIT_RTPRIOを適切に設定しておけばスーパーユーザ以外でも使えるかもしれません。 man sched_setscheduler等を参照して下さい。 # http://www.linux.or.jp/JM/html/glibc-linuxthreads/man3/pthread_setschedparam.3.html

参考URL:
http://www.linux.or.jp/JM/html/glibc-linuxthreads/man3/pthread_setschedparam.3.html
goopon
質問者

補足

ありがとうございます。 こちらでもできそうですね。 ただ、シンプルにスレッド作成時に優先度設定できればいいんですがね。。。

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

関連する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; } -------------------------------ここまで-------------------------------

  • linux 共有オブジェクトの thread-safety

    自作の Windows dll を linux に移植しようとしています。 gcc で so を作ります。 dll は thread-safe にしてあります。その dll の関数を呼び出したすべてのスレッドに、それぞれ固有のメモリ領域を割り当てます。そして、あるスレッドが終了したら、そのスレッドに割り当てられた領域を解放することができるように、「そのスレッドが終了するのを待つスレッド」を作って待機させるようにしました。これで意図どおり動作しています。 ところが、このライブラリを linux に移植しようと、簡単なコードを書いて調べてみたところ、pthread_join() は親スレッドが子スレッドの終了を待つ場合にしか使えないことがわかりました。上の「そのスレッドが終了するのを待つスレッド」を作る、という方法が使えません。 linux で任意のスレッドの終了を知る方法はないでしょうか? あるいは、スレッド固有の領域を管理するもっと良い方法はあるでしょうか? それとも、linux で thread-safety なんか考える必要は無いのでしょうか?

  • pthread_cond_wait での mutex

    以下の様なサンプルプログラム(一部省略)があります。 bossスレッドが1秒ごとにworkerスレッドを起こして、workerスレッドは処理後、再び眠ります。 worker () { while (...) { * pthread_mutex_lock(&g_lock); pthread_cond_wait(&g_signal, &g_lock); * pthread_mutex_unlock(&g_lock); : } } boss() { while (...) { wait( 1 ); * pthread_mutex_lock(&g_lock); pthread_cond_signal(&g_signal) * pthread_mutex_unlock(&g_lock); } } waitで待機し、signalで起こされるのはわかるのですが、 mutexでロックしている意味がわかりません。 mutexが不必要な処理の場合、*部分はいらないのでしょうか?

  • pthreadのスタックサイズ設定取得方法

    Linux(CentOS)で、C言語にてpthreadによるマルチスレッドプログラミングをしています。 各スレッドのスタックサイズを増やす方法と 該当スレッドのスタックサイズを取得する方法をおしえていただけませんでしょうか? 調べてみた限りでは、pthread_attr_setstacksizeが使えそうな気もしましたが、 設定方法がわかりませんでした。 また設定が正しく行われてるかを確認する方法がわかりませんでした。 Linuxのコマンドで実行中のプログラムのスタックサイズを取得するもの とかないのでしょうか? よろしくお願い致します。

  • スレッドの優先度を下げる方法。

    現在バックグラウンドでファイルアクセスを行うプログラムを組んでおります。 しかしこの読み込みのスレッドのCPU占有率が高いためか、バックグラウンドで 読み込んでいるのに関らず、その他の処理が重くなってしまいます。 この問題を解決しようとファイルアクセスの合間にSleepを挟みましたが 一度にファイルアクセスしている時間が長いためかあまり効果が目に見えません。 できたら平均的に負荷がかかるようにしたいのです。 何か解決方法はないでしょうか? 今考えていることは次の二つ(三つ)です。 1.ファイルアクセスを分割して負荷を下げる。 2.何らかの方法でスレッドの優先順位を下げる。 (3.ファイルアクセス自体の負荷を下げる???) 1が一番現実的かと思っています。 2の方法はプロセスの優先度を下げるソフトを目にしたことがあったので 思いついたのですが、そのような関数が今のところ見当たりません。 3は、そういうものがあるのだろうか?というレベルです。 もしあったら積極的に使いたいと思います。 できたら2の方法で解決したいと思っております。 これに関して何かご存知の方がいらっしゃいましたら、ご教授よろしくお願いします。 VC9+XP sp3にてプログラミングを行っております。

  • pthread_mutex_unlock失敗?

    pthreadプログラムで、mutex_lockするスレッドとmutex_unlockするスレッドが別スレッドとなっている場合、mutex_unlockが失敗することはあるでしょうか。mutexの初期設定(mutex_init)時、スレッドの属性は特に指定していません。 OSはHP-UXでCでコードを記述しています。 単発のプログラムで動作確認をした限りでは無事にunlockされているようでした。 (lockスレッドとunlockスレッドが別ということ自体が少し危険なことだとは思うのですが・・・)

  • マルチコア上のLinux環境にて、スレッドを任意のコアに割り当てることは可能か?

    こんにちは。cstepと申します。 Intel Core 2 Quad(コア数x4)のマシン上の ReaHat Linux 9(Kernel 2.4.20-8)環境で、pthread(glibc-2.3.2-11.9, NPTL 0.29, gcc 3.2.2)を使用したマルチスレッド・プログラミングをしています。 各スレッドのコア割り当てを(OSの自動スケジューリングではなくて)手動で固定的に割り当てることは可能でしょうか? 可能な場合それを実現するAPIや実現方法をご教授いただけますでしょうか。 例えば、8つのスレッドからなるプログラムだとした場合、 ・スレッド1と5 → コア1に割り当て ・スレッド2と6 → コア2に割り当て ・スレッド3と7 → コア3に割り当て ・スレッド4と8 → コア4に割り当て というふうに、各スレッド(1~8)を任意のコア(1~4)に固定的に割り当てて動作させたいと考えております。 Windowsの場合は、SetThreadAffinityMask() または SetThreadIdealProcessor() といったAPIを使うことで上記の要求は可能かと思いますが、Linuxでの方法が分からず、質問させていただきました。 よろしくお願い致します。

  • pThreadのメインでなぜsleep?

    Windowsとlinux環境で、pthreadをもちいて、動作確認などをしています。 こちらのサンプルを下に、じっけんしていたのですが。 http://www.ibm.com/developerworks/jp/linux/library/l-posix3/ ここのメインのコードに, sleep(2) という表記があります。 なぜここでsleepをしなければいけないんでしょうか? 実際に、削除してみると、スレッドの作業が途中で終了してしまいました。 このやり方だと、作業時間がわかっている場合は、いいのですが、 もしどれぐらい処理にかかるかわからない場合、困ると思います。 どのようにすれば、sleepを使わずに作業が終わるのをまつことができるでしょうか? int main(void) { int x; wnode *mywork; initialize_structs(); /* CREATION */ if (create_threads()) { printf("Error starting threads... cleaning up.\n"); join_threads(); dabort(); } pthread_mutex_lock(&wq.control.mutex); for (x=0; x<16000; x++) { mywork=malloc(sizeof(wnode)); if (!mywork) { printf("ouch! can't malloc!\n"); break; } mywork->jobnum=x; queue_put(&wq.work,(node *) mywork); } pthread_mutex_unlock(&wq.control.mutex); pthread_cond_broadcast(&wq.control.cond); printf("sleeping...\n"); sleep(2); printf("deactivating work queue...\n"); control_deactivate(&wq.control); /* CLEANUP */ join_threads(); cleanup_structs(); }

  • Linux ログインできないユーザを作る

    Linuxでログインできないユーザを作る場合,ログインシェルには 存在しないシェル(プログラム)を指定すれば出来ると思いますが, 一般的な作法として,何を指定すれば良いのでしょう.空欄?

  • ユーザーインターフェイスの一番単純なスレッドを教えてください。

     こんにちわ。 いきなりですが、VC++でユーザーインターフェイススレッドを使って、 ボタンが1つあればいいだけの別スレッドダイアログを作らなくちゃならないの です。 CWndThreadクラスを使う。。。とかCWndThreadクラスの関数を オーバーライドしなくちゃならないらしいとか、MSDNのヘルプを見てそこまでは わかったのですが、実際、何をどう作っていいのか、途方にくれています。 サンプルを入手して、ソースを追っかけてみているのですが、MSDNのサンプルは 余計な機能とかがいっぱい入っていて、「本当に必要なコードはこれ!!」 というのがよくわかりません。 どなたか、すっごーく単純なスレッド作成、スレッド側の最低限コーディング を教えてください!!というか、助けてください!!!!

このQ&Aのポイント
  • ヨーロッパのチョコレート菓子は夏場の気温で溶けやすい傾向にありますが、日本のチョコレートはそうではありません。
  • ヨーロッパの人々はチョコレート菓子をスーパーで買ってもその場ですぐに食べるか、冷蔵庫に保管します。
  • 日本のチョコレートは油でコーティングされており、夏場でも溶けにくくなっています。
回答を見る