0

ライターがリーダーよりも優先されるように、pthread ライブラリの読み取り/ライター ロックを使用したかったのです。私は自分のマニュアルページを読みました

スレッド実行スケジューリング オプションがサポートされており、ロックに関与するスレッドがスケジューリング ポリシー SCHED_FIFO または SCHED_RR で実行されている場合、ライターがロックを保持している場合、またはより高い優先度または同等の優先度のライターがブロックされている場合、呼び出しスレッドはロックを取得しません。ロックで; それ以外の場合は、呼び出しスレッドがロックを取得します。

そこで、スレッド スケジューリング オプションを設定する小さな関数を書きました。

void thread_set_up(int _thread)
{
 struct sched_param *_param=malloc(sizeof (struct sched_param));
 int *c=malloc(sizeof(int));
 *c=sched_get_priority_min(SCHED_FIFO)+1;
 _param->__sched_priority=*c;
 long *a=malloc(sizeof(long));
 *a=syscall(SYS_gettid);
 int *b=malloc(sizeof(int));
 *b=SCHED_FIFO;
 if (pthread_setschedparam(*a,*b,_param) == -1)
 {
    //depending on which thread calls this functions, few thing can happen
    if (_thread == MAIN_THREAD)
        client_cleanup();
    else if (_thread==ACCEPT_THREAD)
    {
        pthread_kill(params.main_thread_id,SIGINT);
        pthread_exit(NULL);
    }
}

}

申し訳ありませんが、私はすべてa,b,cを試しましたがmalloc、それでも へSIGSEGVの電話に出pthread_setschedparamます。どうしてですか?

4

1 に答える 1

1

これらがあなたの問題の正確な原因であるかどうかはわかりませんが、問題を解決するのに役立つはずです.

(1)pthread_setschedparam成功した場合は 0 を返し、それ以外の場合は正の数を返します。そう

if (pthread_setschedparam(*a,*b,_param) == -1) 

決して実行されません。次のようになります。

if ((ret = pthread_setschedparam(*a, *b, _param)) != 0)
{ //yada yada 
}

余談ですが、あなたが何をしているのかは 100% 明らかではありませんがpthread_kill、可能な限り醜い方法に見えます。

(2) syscall(SYS_gettid)OS スレッド ID を取得します。 pthread__setschedparampthreadsスレッド idが必要ですが、これは異なります。pthreads スレッド ID は、pthread_createおよびpthread_selfdatatype で返されpthread_tます。を変更して、pthread__setschedparam代わりにこのタイプと適切な値を使用し、状況が改善されるかどうかを確認します。

(3) スケジュールを変更するには、特権ユーザーとして実行する必要があります。root や sudo などでプログラムを実行してみてください。

于 2012-06-09T00:11:18.407 に答える