線程的屬性
脫離線程:不向主線程返回信息,不需要主線程等待.
通過(guò)兩種方法創(chuàng)建:
調(diào)用pthread_detach;
修改線程的屬性. <- 這里使用
#include <pthread.h>
int pthread_attr_init(pthread_attr_t *attr);
初始化一個(gè)線程屬性對(duì)象.
pthread_destroy
回收一個(gè)線程屬性對(duì)象.
#include <pthread.h>
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);
這個(gè)屬性允許我們無(wú)需對(duì)線程進(jìn)行合并:
| PTHREAD_CREATE_JOINABLE 默認(rèn).
| PTHREAD_CREATE_DETACHED 不能調(diào)用pthread_join來(lái)獲得另一個(gè)線程的退出狀態(tài).
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
int pthread_attr_getschedpolicy(const pthread_attr_t *attr, int *policy);
控制線程的調(diào)度方式:
| SCHED_OTHER 默認(rèn)
| SCHED_RP 循環(huán)(round_robin) <- 下面2個(gè)調(diào)度方式具備實(shí)時(shí)調(diào)度功能,需要root權(quán)限.
| SCHED_FIFO 先進(jìn)先出
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
和schedpolicy配合使用,控制SCHED_OTHER線程的調(diào)度策略.
int pthread_attr_setinheritsched(pthread_attr_t *attr, int inherit);
int pthread_attr_getinheritsched(const pthread_attr_t *attr, int *inherit);
| PTHREAD_EXPLICIT_SCHED 調(diào)度由屬性明確設(shè)置.
| PTHREAD_INHERIT_SCHED 新線程沿用創(chuàng)建者的屬性.
int pthread_attr_setscope(pthread_attr_t *attr, int scope);
int pthread_attr_getscope(const pthread_attr_t *attr, int *scope);
控制一個(gè)線程調(diào)度的計(jì)算方式,目前Linux只支持PTHREAD_SCOPE_SYSTEM.
int pthread_attr_setstacksize(pthread_attr_t *attr, int scope);
int pthread_attr_getstacksize(const pthread_attr_t *attr, int *scope);
控制線程創(chuàng)建的棧大小,單位字節(jié).可選.
Linux在實(shí)現(xiàn)線程時(shí),默認(rèn)的棧很大,這個(gè)屬性有點(diǎn)多余.
創(chuàng)建脫離線程:
/*
* 線程屬性-創(chuàng)建脫離線程
* 主線程不等待子線程結(jié)束,只通過(guò)thread_finished標(biāo)志來(lái)檢測(cè)子線程是否已結(jié)束,并顯示線程之間仍然共享的變量.
*/
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
void *thread_function(void *arg);
char g_message[] = "Hello World!";
int g_thread_finished = 0;
int main(){
int res;
pthread_t a_thread;
pthread_attr_t thread_attr;
res = pthread_attr_init(&thread_attr);
if(res != 0){
perror("Attribute creation failed");
exit(EXIT_FAILURE);
}
res = pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_DETACHED);
if(res != 0){
perror("Setting detached attribute failed");
exit(EXIT_FAILURE);
}
res = pthread_create(&a_thread, &thread_attr,
thread_function, (void *)g_message);
if(res != 0){
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
(void)pthread_attr_destroy(&thread_attr);
while(!g_thread_finished){
printf("Waiting for thread to say it's finished
\n");
sleep(1);
}
printf("Other thread finished, bye!\n");
exit(EXIT_SUCCESS);
}
void *thread_function(void *arg){
printf("thread_function is running. Argument was %s\n", (char *)arg);
sleep(4);
printf("Second thread setting finished flag, and exit now\n");
g_thread_finished = 1;
pthread_exit(NULL);
} 執(zhí)行結(jié)果:
$ gcc -D_REENTRANT thread5.c -o thread5 -lpthread
$ ./thread5
Waiting for thread to say it's finished
thread_function is running. Argument was Hello World!
Waiting for thread to say it's finished
Waiting for thread to say it's finished
Waiting for thread to say it's finished
Second thread setting finished flag, and exit now
Other thread finished, bye! --
FROM: Linux程序設(shè)計(jì)