相关API
初始化和释放
#include <pthread.h>
/*
参数1:attr指向线程属性空间,本质是一个结构体空间
typedef struct{
int etachstate; //线程的分离状态
int schedpolicy; //线程调度策略
struct sched_param schedparam; //线程的调度参数
int inheritsched; //线程的继承性
int scope; //线程的作用域
size_t guardsize; //线程栈末尾的警戒缓冲区大小
int stackaddr_set; //线程的栈设置
void* stackaddr; //线程栈的位置
size_t stacksize; //线程栈的大小
} pthread_attr_t;
返回值:成功返回 0 错误返回错误码
在使用pthread_create函数创建线程的时候,
1) 设置线程属性参数,设置线程属性:
2) 线程属性参数设置位NULL,采用默认线程属性(默认的属性为非绑定、非分离、缺省的堆栈、与父进程同样级别的优先级)
*/
int pthread_attr_init(pthread_attr_t *attr); /* 初始化线程属性空间 */
int pthread_attr_destroy(pthread_attr_t *attr); /* 释放线程属性空间 */
设置线程属性状态
#include <pthread.h>
/**
* [pthread_attr_setdetachstate 设置线程属性状态]
* @param attr [指向的线程属性空间]
* @param detachstate [
* PTHREAD_CREATE_DETACHED 分离线程
PTHREADCREATE_JOINABLE 非分离线程
* ]
* @return [成功返回0 错误返回错误码]
*/
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate); //设置
int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);//获取
设置线程栈
#include <pthread.h>
/**
* [pthread_attr_setstack 设置线程栈]
* @param attr [指向线程属性空间]
* @param stackaddr [传递栈空间地址]
* @param stacksize [空间的大小]
* @return [成功0 失败错误码]
*/
int pthread_attr_setstack(pthread_attr_t *attr,void *stackaddr, size_t stacksize);
int pthread_attr_getstack(const pthread_attr_t *attr, void **stackaddr, size_t *stacksize);
线程栈大小
#include <pthread.h>
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t *stacksize);
线程栈地址
#include <pthread.h>
int pthread_attr_setstackaddr(pthread_attr_t *attr, void *stackaddr);
int pthread_attr_getstackaddr(const pthread_attr_t *attr, void **stackaddr);
实例
#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void *pthread_func(void *arg)
{
while(1)
{
printf("child pthread\n");
sleep(1);
}
}
int main()
{
int ret;
pthread_t pthread_id;
pthread_attr_t attr;
/* 设置线程的属性 */
ret = pthread_attr_init(&attr);/* 线程属性设置默认值 */
if (ret != 0)
{
fprintf(stderr, "pthread_attr_init fail\n");
return -1;
}
#if 1
int detachstate;
/* 获取线程属性是否分离 */
ret = pthread_attr_getdetachstate(&attr, &detachstate);
if (ret != 0)
{
fprintf(stderr, "pthread_attr_getdetachstate fail\n");
return -1;
}
if (detachstate == PTHREAD_CREATE_DETACHED)
{
printf("PTHREAD_CREATE_DETACHED");
}
else
{
printf("PTHREAD_CREATE_JOINABLE");
}
#else
/* 初始化线程属性为分离模式 */
ret = pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
if (ret != 0)
{
fprintf(stderr, "pthread_attr_setdetachstate fail\n");
return -1;
}
#endif
/* 创建线程 */
ret = pthread_create(&pthread_id, &attr, pthread_func, NULL);
if (ret != 0)
{
fprintf(stderr, "create child pthread fail\n");
return -1;
}
pthread_attr_destroy(&attr);
/* 主线程阻塞等待子线程退出,才返回继续向后执行 */
pthread_join(pthread_id, NULL);
printf("main pthread\n");
}
网友评论