『UNIX環境高度プログラミング』ノート--スレッド属性

4540 ワード

pthread_を呼び出す前にcreate関数の例では、入力されたパラメータはpthread_を指すのではなく、空のポインタです.attr_t構造の指摘、使用可能
pthread_attr_t構造は、スレッドのデフォルト属性を変更し、作成したスレッドに関連付けます.pthread_を使用できますattr_Init関数初期化
pthread_attr_t構造.pthread_を呼び出すattr_init後、pthread_attr_t構造に含まれる内容は、オペレーティングシステムが現在サポートしているスレッドのすべての属性のデフォルトです.
値です.個々のプロパティの値を変更する場合は、他の関数を呼び出す必要があります.この詳細は後述します.
#include<pthread.h>
int pthread_attr_init(pthread_attr_t *attr);
int pthread_attr_destroy(pthread_attr_t *attr);
// 0, 。

1.属性の分離


スレッド分離の概念については、以下を参照してください.http://blog.csdn.net/todd911/article/details/17883201.pthread_の使用detach
関数を使用すると、スレッドが終了したときにオペレーティングシステムが使用したリソースを回収できます.pthread_を変更できますattr_t構造のdetachstateスレッドプロパティ.スレッドを分離状態にする
を選択して設定できます.pthread_を使用できますattr_setdetachstate関数スレッドプロパティdetachstateは、次の2つの合法的な値の1つを指します.
PTHREAD_CREATE_DETACHED:スレッドを分離状態で開始します.
PTHREAD_CREATE_JOINABLE:スレッドが正常に起動し、アプリケーションはスレッドの終了状態を取得できます.
#include <pthread.h>
int pthread_attr_getdetachstate(const *pthread_attr_t *restrict attr, int *detachstate);
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
// 0, 。
では、スレッドを分離した状態で作成する関数を次に示します.
int makethread(void* (*fn)(void*), void *arg){
	int err;
	pthread_t tid;
	pthread_attr_t attr;
	
	err = pthread_attr_init(&attr);
	if(err != 0){
		return err;
	}
	err = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
	if(err == 0 ){
		err = pthread_create(&tid, &attr, fn, arg);
	}
	pthread_attr_destroy(&attr);
	return err;
}

こちらは判断していませんpthread_attr_destroy関数の戻り値は、一般的にこの関数ではエラーは発生しませんが、確かに失敗すると、クリーンアップ作業が困難になります.
作成したばかりのスレッドを破棄する必要があります.このスレッドはすでに実行されている可能性があります.pthread_を無視attr_destroyのエラーは、最悪の場合を返します.
pthread_attr_Initにはメモリ領域が割り当てられており、これらの領域は漏洩します.

2.スタック属性


スレッドスタックのプロパティのクエリーと変更は、一般的に関数pthread_を介して行われます.attr_getstackとpthread_attr_setstackで行います.
#include <pthread.h>
int pthread_attr_getstack(const pthread_attr_t *restrict attr, void **restrict stackaddr, size_t *restrict stacksize);
int pthread_attr_setstack(const pthread_attr_t *attr, void *stackaddr, size_t stackszie);
// 0, 。
の2つの関数は、stackaddrスレッドプロパティを管理するために使用されてもよいし、stacksizeスレッドプロパティを管理するために使用されてもよい.
スレッドにとって仮想アドレス空間のサイズは固定されており、プロセスにはスタックが1つしかないため、そのサイズは通常問題ではありませんが、スレッドにとって同じサイズの仮想
アドレス空間はすべてのスレッドスタックで共有する必要があります.アプリケーションがスレッドを使用しすぎると、スレッドスタックの累積サイズが使用可能な仮想アドレス空間を超えます.
スレッドスタックの仮想アドレス空間が切れた場合、mallocまたはmmapを使用して他のスタックに空間を割り当て、pthread_を使用します.attr_setstack関数
スレッドスタックの位置を変更します.スレッドスタックが占めるメモリ範囲でアドレス可能な最下位アドレスはstackaddrパラメータによって指定できます.
アプリケーションはpthread_を使用することもできます.attr_getstacksizeとpthread_attr_setstacksize関数スレッドプロパティstacksizeを読み込みまたは設定します.
#include<pthread.h>
int pthread_attr_getstacksize(const pthread_attr_t *restrict attr, size_t *restrict stacksize);
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
// 0, 。
スタックのデフォルトサイズを変更したいが、スレッドスタックの割り当ての問題を自分で処理したくない場合はpthread_を使用します.attr_setstacksize関数は非常に役に立ちます.

3.guardsizeプロパティ


スレッド属性guardsizeは、スタックのオーバーフローを回避するために使用される拡張メモリのサイズのみを制御します.この属性はデフォルトでPAGESIZEバイトです.
guardsizeスレッドプロパティを0に設定すると、プロパティのこのようなプロパティ動作は許可されません.この場合、警戒バッファは提供されません.同じように
スレッドプロパティstackaddrを変更すると、スタックを自分で管理し、guardsizeスレッドプロパティ設定に等しい警戒スタックバッファメカニズムを無効にすると仮定します.
0.
#include<pthread.h>
int pthread_attr_getguardsize(const phread_attr_t *restrict attr, size_t *restrict guardsize);
int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
// 0, 。

4.同時性


同時性は、オペレーティングシステムの実装がカーネルレベルのスレッドとユーザーレベルのスレッドの間で維持されている場合、ユーザーレベルのスレッドがマッピングできるカーネルスレッドまたはプロセスの数を制御します.
1対1のマッピングでは、すべてのスレッドがスケジューリングされる可能性がありますが、オペレーティングシステムの実装によってユーザー・レベルのスレッドが作成される場合、同時性を変更する効果はありません.
カーネルレベルのスレッドまたはプロセスまでのマッピング関係が複数対1である場合、所定の時間内に実行可能なユーザーレベルのスレッド数を増やすと、パフォーマンスが向上する可能性があります.
pthread_setconcurrency関数は、所望の同時性を示すプロンプトシステムに使用することができる.
#include <pthread.h>
int pthread_getconcurrency(void); // 
int pthread_setconcurrency(int level); // 0, 。

pthread_getconcurrency関数は、現在の同時性を返します.オペレーティングシステムが現在並列度を制御している場合(すなわち、set関数が呼び出されていない場合)、
関数は0を返します.
pthread_setconcurrency関数が設定した同時度はシステムに対するヒントにすぎず、システムは要求の同時度が必ず採用されることを保証することはできない.
自分でどの同時性を使うかを決めてlevelを0に設定します.
注意:上で述べたstack sizeとguard sizeは、unix環境では、linux環境ではスレッドが軽量レベルのプロセスの概念で実現されるため、
上記の説明には適用されません.