2016-10-11 7 views
1

私はLinux上でマルチプロセスリアルタイムアプリケーションを開発していますが、Mutexesによって保護されている操作がいくつかあります。私はmutexをPTHREAD_PRIO_PROTECTプロトコルに切り替えるつもりですが、pthread_mutex_lock()呼び出しで常にEINVALを取得するので、何かが欠けているはずです。pthread_mutex_lock()は、天井が正しく定義されていても、常にPTHREAD_PRIO_PROTECTミューテックスでEINVALを返します

以下のコードはすべて、同様のエラー報告のチェックを使用しています。コードリストを単純化するために、// Error Reportingでそれをマークします。それぞれ、以下のブロブの一部バリアントを持っています

{ 
    char message[256]; 
    throw std::runtime_error(std::string("Error locking Mutex: ") + 
     strerror_r(errno, message, sizeof(message))); 
} 

ここでは40の天井を設定し、基本的なミューテックスの初期化コードです:

pthread_mutex_t thelock; 

pthread_mutexattr_t attrib; 
pthread_mutexattr_init(&attrib); 
if (pthread_mutexattr_setprotocol(&attrib, PTHREAD_PRIO_PROTECT)) 
{ 
    // Error Reporting 
}  

if (pthread_mutexattr_setprioceiling(&attrib, 40)) 
{ 
    // Error Reporting 
}  
pthread_mutex_init(&thelock, &attrib); 

は20の優先順位を現在のスレッドにスケジュールを設定する(ほか天井下):

明示的なスケジューラセットを持たないスレッドを作成し、作成前にスレッド属性にスケジューラ/パラメータを設定しました。

どんなに私はそれを行う、私は次のコードのためにEINVALで終わるどの方法:私はそれを適切に優先順位を変更することができるので、実行する前に、私のテストプログラムの機能を設定している

if (pthread_mutex_lock(&thelock)) 
{ 
    // Error Reporting 
} 

sudo setcap 'cap_sys_nice=eip' threadpriotest 

答えて

2

私の以前のテストは間違っていたようです。私はmutexを主張した最初のスレッドの優先順位を変更したときにpthread_attr_setinheritsched(& threaddr、PTHREAD_EXPLICIT_SCHED)を使うのを忘れていました。 sched_setscheduler()を使う方法はうまくいきますが、当時の最初のスレッドでは使用していませんでした。

最終行は、スレッドがPTHREAD_PRIO_PROTECTで動作する前に、すでにSCHED_FIFOを使用している必要があるということです。これは、PTHREAD_PRIO_INHERITに反します。これは、非FIFOスレッドでうまくいくようです。

関連する問題