2016-12-28 9 views
1

を失敗した私は、SCHED_RRとのpthreadを作成するためのいくつかのコアを書いてみる:スレッドの作成が

pthread_attr_t attr; 
pthread_attr_init(&attr); 
pthread_attr_setinheritsched (&attr, PTHREAD_EXPLICIT_SCHED); 
pthread_attr_setschedpolicy(&attr, SCHED_RR); 
struct sched_param params; 
params.sched_priority = 10; 
pthread_attr_setschedparam(&attr, &params); 
pthread_create(&m_thread, &attr, &startThread, NULL); 
pthread_attr_destroy(&attr); 

しかし、スレッドが実行does't、私はより多くのパラメータを設定する必要がありますか?

答えて

0

スレッドは、CAP_SYS_NICE機能を持たないスケジューリングをSCHED_OTHERにのみ設定できます。 sched(7)から:あなたはpthread_attr_setschedpolicy()あなたがとして実行されているか、実行しているユーザーのために、この機能を有効にしている場合を除き、それは(すべての可能性に失敗していますを使用して、ラウンドロビンスケジューリング(SCHED_RR)へのスケジューリングポリシーを設定する際に意味

In Linux kernels before 2.6.12, only privileged (CAP_SYS_NICE) 
    threads can set a nonzero static priority (i.e., set a real-time 
    scheduling policy). The only change that an unprivileged thread can 
    make is to set the SCHED_OTHER policy, and this can be done only if 
    the effective user ID of the caller matches the real or effective 
    user ID of the target thread (i.e., the thread specified by pid) 
    whose policy is being changed. 

プログラムはsysadmin/rootユーザーとしてCAP_SYS_NICEを上書きすることができます)。

あなたはsetcapプログラムを使用して機能を設定することができます。

$ sudo setcap cap_sys_nice=+ep ./a.out 

a.outは、あなたのプログラムの名前であると仮定した場合)。

エラーチェックを行った場合は、このことがわかりました。すべてのpthread関数(通常はすべてのライブラリ関数)の戻り値を調べて失敗する必要があります。

あなたは完全なコードを投稿していないので、あなたが全体をm_threadが作成される前メインスレッドが終了する可能性があるので(ユーザーが作成するスレッドでに参加し、この出口ていない場合、それは問題になる可能性がありますプロセス)。

pthread_join(m_thread, NULL); 

か、メインスレッドがもはやメインでpthread_exit(NULL);を(使用して必要とされている場合は、参加せずにメインスレッドを終了することができませんでしたが):だから、あなたが参加することをお勧めします。

関連する問題