スレッド属性
スレッド作成関数pthread_create()の2番目のパラメーター(pthread_attr_t * attr)は、スレッドの属性を表します。通常、デフォルト属性(非バインド、非分離、デフォルト1MBスタック、および親プロセスと同じ優先度)を示すためにNULLに設定されます。スレッドの多くの属性を変更できますが、これらの属性には主にバインディング属性、分離属性、スタックアドレス、スタックサイズ、優先度が含まれます。プロパティのバインドとプロパティの分離の基本的な概念を次に説明します。
1.バインディングプロパティ
Linuxは「1対1」のスレッド化メカニズムを使用します。つまり、ユーザースレッドはカーネルスレッドに対応します。バインディング属性は、ユーザースレッドがカーネルスレッドに固定的に割り当てられることを意味します。CPUタイムスライスのスケジューリングはカーネルスレッドに向けられているため、バインディング属性を持つスレッドは、必要なときに常にそれに対応するカーネルスレッドが存在することを保証できます。非バインディング属性は、ユーザースレッドとカーネルスレッドの関係が常に固定されているわけではないが、システムが割り当てを制御することを意味します
2.属性の分離
分離属性は、スレッドがどのように終了するかを決定するために使用されます。非分離の場合、スレッドが終了しても、スレッドが占有していたシステムリソースは解放されません、つまり、実際には終了しません。pthread_join()関数が戻ったときにのみ、作成されたスレッドは占有されていたシステムリソースを解放できます。detached属性では、スレッドが占有していたシステムリソースは、スレッドが終了するとすぐに解放されます。
3.プロパティ設定機能
これらのプロパティの設定は、特定の機能を介して行われます
- 最初にpthread_attr_init()関数を呼び出して初期化してから、属性設定関数を呼び出します
- バインディング属性を設定し、pthread_attr_setscope()関数を使用します
- detached属性を設定するには、pthread_attr_setdetachstate()関数を使用します
- 優先順位を設定し、pthread_attr_getschedparam()関数を使用して優先順位を取得し、phread_attr_setschedparam()関数を使用して優先順位を設定します
- プロパティを設定した後、pthread_create()関数を使用してスレッドを作成します。
pthread_attr_init()
/*****pthread_attr_init()*****/
函数原型:int pthread_attr_init(pthread_attr_t *attr)
传 入 值:attr 线程属性结构指针
返 回 值:成功返回0;失败返回错误码
pthread_attr_setscope()
/*****pthread_attr_setscope()*****/
函数原型:int pthread_attr_setscope(pthread_attr_t *attr, int scope)
传 入 值:attr 线程属性结构指针
scope -->PTHREAD_SCOPE_SYSTEM 绑定
-->PTHREAD_SCOPE_PROCESS 非绑定
返 回 值:成功返回0;失败返回-1
pthread_attr_setdetachstate()
/*****pthread_attr_setdetachstate()*****/
函数原型:int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
传 入 值:attr 线程属性结构指针
detachstate -->PTHREAD_CREATE_DETACHED 分离
-->PTHREAD_CREATE_JOINABLE 非分离
返 回 值:成功返回0;失败返回错误码
pthread_attr_getschedparam()
/*****pthread_attr_getschedparam()*****/
函数原型:int pthread_attr_getschedparam(pthread_attr_t *attr, struct sched_param *param)
传 入 值:attr 线程属性结构指针
param 线程优先级
返 回 值:成功返回0;失败返回错误码
pthread_attr_setschedparam()
/*****pthread_attr_setschedparam()*****/
函数原型:int pthread_attr_setschedparam(pthread_attr_t *attr, struct sched_param *param)
传 入 值:attr 线程属性结构指针
param 线程优先级
返 回 值:成功返回0;失败返回错误码
4.関数の例
バインディングプロパティとデタッチプロパティを持つスレッドを作成し、メインスレッドはfinish_flagフラグ変数を介してスレッドの終了のメッセージを取得します
/*****thread_attr.c*****/
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define REPEAT_NUMBER 5 //每个线程中的小任务数
#define DELAY_TIME_LEVELS 10.0 //小任务之间的最大时间间隔
int finish_flag = 0;
void *thrd_func(void *arg){
int delay_time = 0,count = 0;
printf("Thread is starting\n");
for(count = 0;count < REPEAT_NUMBER;count++){
delay_time = (int)(rand()*DELAY_TIME_LEVELS/(RAND_MAX)) + 1;
sleep(delay_time);
printf("\tThread: job %d delay = %d\n",count,delay_time);
}
printf("Thread finished\n");
finish_flag = 1;
pthread_exit(NULL);
}
int main(){
pthread_t thread;
pthread_attr_t attr;
int no = 0,res;
void * thrd_ret;
srand(time(NULL));
res = pthread_attr_init(&attr); //初始化线程属性对象
if(res != 0){
printf("Create attribute failed\n",no);
exit(res);
}
res = pthread_attr_setscope(&attr,PTHREAD_SCOPE_SYSTEM); //设置绑定属性
res+ = pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHDE); //设置分离属性
if(res != 0){
printf("Setting attribute failed\n",no);
exit(res);
}
res = pthread_create(&thread, &attr, thrd_func, NULL);
if(res != 0){
printf("Create thread failed\n",no);
exit(res);
}
pthread_attr_destory(&attr) //释放线程属性对象
printf("Create thread sucess\n");
while(!finish_flag){
printf("Waiting for thread to finish...\n");
sleep(2)
}
return 0;
}