Linux 다중 스레드 프로그래밍 | 스레드 속성

스레드 속성

스레드 생성 함수 pthread_create ()의 두 번째 매개 변수 (pthread_attr_t * attr)는 스레드의 속성을 나타냅니다. 일반적으로 기본 속성을 나타 내기 위해 NULL로 설정됩니다 (비 바인딩, 비 분리, 기본 1MB 스택 및 상위 프로세스와 동일한 우선 순위). 스레드의 많은 속성을 변경할 수 있으며 이러한 속성에는 주로 바인딩 속성, 분리 속성, 스택 주소, 스택 크기 및 우선 순위가 포함됩니다. 다음은 속성 바인딩 및 속성 분리의 기본 개념을 설명합니다.

1. 바인딩 속성

Linux는 "일대일"스레딩 메커니즘을 사용합니다. 즉, 사용자 스레드는 커널 스레드에 해당합니다. 바인딩 속성은 사용자 스레드가 커널 스레드에 고정적으로 할당됨을 의미합니다. CPU 타임 슬라이스의 스케줄링은 커널 스레드를 지향하기 때문에 바인딩 속성이있는 스레드는 필요할 때 항상 해당하는 커널 스레드가 있음을 보장 할 수 있습니다. 비 바인딩 속성은 사용자 스레드와 커널 스레드 간의 관계가 항상 고정되어 있지는 않지만 시스템이 할당을 제어 함을 의미합니다.

2. 속성 분리

분리 속성은 스레드가 스스로 종료하는 방법을 결정하는 데 사용됩니다. 비 분리의 경우 쓰레드가 종료 될 때 자신이 차지하고 있던 시스템 자원이 해제되지 않고, 즉 실제로 종료되지는 않으며, pthread_join () 함수가 반환 될 때만 생성 된 쓰레드가 차지하고있는 시스템 자원을 해제 할 수 있습니다. detached 속성에서 스레드가 차지하는 시스템 리소스는 스레드가 종료 될 때 즉시 해제됩니다.

3. 속성 설정 기능

이러한 속성의 설정은 특정 기능을 통해 수행됩니다.

  • 먼저 pthread_attr_init () 함수를 호출하여 초기화 한 다음 속성 설정 함수를 호출합니다.
  • 바인딩 속성 설정, pthread_attr_setscope () 함수 사용
  • 분리 된 속성을 설정하려면 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;
}

추천

출처blog.csdn.net/Chuangke_Andy/article/details/108357669