私は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