2012-03-10 16 views
1

私は自分のプログラムで3つのプロセスを作成したいと思いますし、各プロセスにはいくつかのスレッドがあります。
各スレッドは無限のタスクであり、スリープして定期的に起きることがあります。また、プロセスにはいくつかのタスクがあります。
私の質問は次のとおりです:Linuxでスレッドの属性を設定する方法は?

1)スレッドを分離して設定する必要はありますか?スレッドを分離して設定すると、実行されないようです! しかし、スレッドが結合可能な場合、プロセスはスレッドを終了するまで待つ必要があり、それ自体の作業はできません! どちらを選ぶべきですか?

2)スケジュールポリシーの対象は何ですか?つまり、スケジュールポリシーをFIFOとして設定すると、すべてのプロセスのすべてのスレッドがFIFOポリシーによってスケジュールされますか?または、この属性で設定されたスレッドだけがこのポリシーによってスケジュールされますか?

3)スレッドの優先順位の範囲は何ですか?スレッドの優先度は、単一のプロセスでのみ有効であり、別のプロセスでは、スレッド優先度の別のセットが存在するか?そして彼らはお互いに感染しませんか?

私はあなたの助けに感謝します!ありがとうございました!

答えて

0

にパラメータとしてそれを使用する必要がありますスレッドを作成するには

。切り離されたスレッドは他のすべてと同様にタイムスライスを取得します。それが実行されていない場合、あなたがやっていることです。 threadfuncとスレッドを作成する関数を別の質問に投稿してください。

あなたの行っていることを知らなくても、スレッドを結合できるかどうかは分かりません。結合可能スレッドの主な利点は、完了した時点を知っていて、戻りデータを確認できることです。これらがあなたにとって重要でない場合、それらを結合可能にすることには実質的な利点はありません - それがデフォルトであるため、作成するほうがほんのわずかです。

pthread_joinでブロックしたくない場合は、あなたが追求できる戦略があります。あなたのスレッドは、死ぬ前にスイッチを設定することができます。条件変数を使用することも、デッドスレッドを結合する別のスレッドなどを持つこともできます。繰り返しますが、あなたの特定のケースで何が最善の戦略であるかを知ることは不可能です。

(2 & 3)スレッドはスケジュールポリシーとそれを作成するスレッドの優先度を継承し、特に変更しない限りそのままにします。 1つのプロセス内のスレッドのポリシー/優先順位は、他のプロセスとは直接関係しません。

+0

印象派な答え!!!とても便利!ありがとうございました! – city

0

私は最初の質問に答えるよ:

デタッチとしてあなたは、単にメインプロセスの最後にそれらを結合することができるので、スレッドを作成する必要はありませんが。デタッチとしてあなたが最初の属性を作成し、(1)あなたがコーディングエラーを持っているpthread_create

pthread_t thread1; 
pthread_attr_t attr; 

int chk; 

chk = pthread_attr_init(&attr); 
printf("attr_init: %d\n",chk); 

chk = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); 
printf("attr_setdetachstate: %d\n",chk); 

chk = pthread_create(&thread1, &attr, function, NULL); 
+0

ありがとうございます。 – city

1

離脱または結合:必要な要件のタイプによって異なります。

メイン実行可能スレッド(新しいスレッドを生成する)が作業を継続する必要があり、生成されたスレッドの戻り値を待つ必要がない場合は、DETACHを使用できます。

メインの実行可能スレッドが必要な場合は、戻り値を待つだけで、他のタスクは単独で実行する必要はありません。 JOINを使用できます。

スレッドが作成されると、属性によって変更されない限り、スレッドはpthread_createを呼び出す前にデフォルトスケジューリングポリシーを使用します。また、作成後、スケジューリング方針を動的に変更することができます。注:スケジューリングポリシーは同じプライオリティのスレッドに影響します。

優先度:pthread_setschedparamを使用して優先度を変更できます(スケジューリングポリシーの場合も同様)。 しかし、Linuxスレッドでも軽量プロセスです。つまり、すべてのスレッドが優先されるのは、各プロセス内ではなく、プロセスレベル全体である です。

+0

プログラム全体にスケジュールポリシーしかないことを意味しますか?また、どのプロセスに関係なく、すべてのスレッドは、プログラム全体で同じ優先順位でリグレードされますか? – city

+0

優先順位とスケジュールはスレッドレベルで設定されます。プロセスとして各スレッドをそれ自身で見てください。プロセスP1にTh1がある場合、SchedポリシーSched1とSched2のTh2スレッド。プロセスP2は、それぞれ、スケジュールポリシーSched1、Sched2を有するスレッドTh3、Th4を有する。したがって、OSはSched1メカニズムとTh2を使用してTh1、Th3をスケジューリングし、Th4はSched2メカニズムを使用します(スレッドは同じ優先順位を持つと仮定します)。同様に、P1に5つのPr1スレッドともう1つの3つのPr2スレッドがある場合。 P2にPr1の2つの世代がある場合。 P1(5 threds)+ P2(2 threads)の場合、各スレッドはOSによってその優先度の1/7タイムスライスを取得します(同じスケジューリング方針を前提とします)。 – vamsi

関連する問題