Linux-Multithread-Programmierung | Thread-Attribute

Thread-Attribute

Der zweite Parameter (pthread_attr_t * attr) der Thread-Erstellungsfunktion pthread_create () repräsentiert die Attribute des Threads. Im Allgemeinen auf NULL gesetzt, um die Standardattribute anzugeben (unverbindlich, nicht trennbar, Standard-1-MB-Stapel und dieselbe Priorität wie der übergeordnete Prozess). Viele Attribute eines Threads können geändert werden. Diese Attribute umfassen hauptsächlich Bindungsattribute, Trennungsattribute, Stapeladresse, Stapelgröße und Priorität. Im Folgenden werden die grundlegenden Konzepte der Bindungseigenschaften und der Trenneigenschaften beschrieben

1. Bindungseigenschaften

Linux verwendet einen "Eins-zu-Eins" -Threading-Mechanismus, dh ein Benutzer-Thread entspricht einem Kernel-Thread. Das Bindungsattribut bedeutet, dass ein Benutzer-Thread fest einem Kernel-Thread zugeordnet ist. Da die Planung von CPU-Zeitscheiben auf den Kernel-Thread ausgerichtet ist, kann der Thread mit dem Bindungsattribut sicherstellen, dass bei Bedarf immer ein Kernel-Thread vorhanden ist. Das unverbindliche Attribut bedeutet, dass die Beziehung zwischen Benutzer-Threads und Kernel-Threads nicht immer festgelegt ist, das System jedoch die Zuordnung steuert

2. Trennung von Attributen

Das Trennungsattribut wird verwendet, um zu bestimmen, wie ein Thread sich selbst beendet. Im Falle einer Nichttrennung werden beim Beenden des Threads die von ihm belegten Systemressourcen nicht freigegeben, dh nicht wirklich beendet. Nur wenn die Funktion pthread_join () zurückgegeben wird, kann der erstellte Thread die belegten Systemressourcen freigeben. Unter dem Attribut "Los" werden die vom Thread belegten Systemressourcen sofort freigegeben, wenn der Thread endet

3. Eigenschaft Einstellungsfunktion

Die Einstellungen dieser Eigenschaften erfolgen über bestimmte Funktionen

  • Rufen Sie zuerst die Funktion pthread_attr_init () auf, um sie zu initialisieren, und rufen Sie dann die Attributeinstellungsfunktion auf
  • Legen Sie Bindungsattribute fest und verwenden Sie die Funktion pthread_attr_setscope ()
  • Verwenden Sie die Funktion pthread_attr_setdetachstate (), um das getrennte Attribut festzulegen
  • Legen Sie die Priorität fest, verwenden Sie die Funktion pthread_attr_getschedparam (), um die Priorität abzurufen, und verwenden Sie dann die Funktion phread_attr_setschedparam (), um die Priorität festzulegen
  • Verwenden Sie nach dem Festlegen der Eigenschaften die Funktion pthread_create (), um einen Thread zu erstellen

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. Funktionsbeispiele

Erstellen Sie einen Thread mit Bindungs- und Trenneigenschaften, und der Hauptthread erhält die Nachricht vom Ende des Threads über eine Flagvariable 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;
}

Ich denke du magst

Origin blog.csdn.net/Chuangke_Andy/article/details/108357669
Empfohlen
Rangfolge