//线程详解
设置调度方式
int pthread_attr_setschedpolicy(pthread_attr_t *attr, int policy);
int pthread_attr_getschedpolicy(pthread_attr_t *attr, int *policy);
SCHED_OTHER 默认,使用此种方式,线程不可以设置优先级
SCHED_FIFO 实时,可以设置优先级,先到先服务。一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃
SCHED_RR 实时,轮转,可以设置优先级,当进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平
实验结果显示优先级高的不一定会先执行完, 控制线程的运行还是用信号量比较可靠
int sched_get_priority_max(int policy);
int sched_get_priority_min(int policy);
获取优先级的最大与最小值
int pthread_attr_setinheritsched(pthread_attr_t *attr,int inheritsched);
int pthread_attr_getinheritsched(pthread_attr_t *attr,int *inheritsched);
PTHREAD_INHERIT_SCHED 新的线程继承创建线程的策略和参数! 不会默认继承
PTHREAD_EXPLICIT_SCHED 来自参数
int pthread_attr_setstacksize(pthread_attr_t *attr, size_t stacksize);
int pthread_attr_getstacksize(pthread_attr_t *attr, size_t *stacksize);
若不指定分配堆栈大小,系统会分配默认值,查看默认值方法如下:8M
ulimit -s
8192
在嵌入式中内存不是很大,若采用默认值的话,若内存不足,则 pthread_create 会返回失败
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
int pthread_attr_getdetachstate(pthread_attr_t *attr, int *detachstate);
PTHREAD_CREATE_DETACHED 分离
PTHREAD_CREATE_JOINABLE 可接合 默认 用pthread_join来回收线程资源
一个可结合的线程能够被其他线程收回其资源和杀死;在被其他线程回收之前,它的存储器资源(如栈)是不释放的。
一个分离的线程是不能被其他线程回收或杀死的,它的存储器资源在它终止时由系统自动释放。
#include<stdio.h>
#include<pthread.h>
#include <signal.h>
#include<string.h>
int main()
{
pthread_t task,task1,task2;
pthread_attr_t attr,attr1;
struct sched_param sched_prio;
int ret=-1;
char a[]="hello1111";
char b[]="hello2222";
ret = pthread_attr_init(&attr);
if(0 != ret)
{
printf("Task pthread_attr_init failed!\n");
return -1;
}
ret = pthread_attr_init(&attr1);
if(0 != ret)
{
printf("Task pthread_attr_init1 failed!\n");
return -1;
}
ret = pthread_attr_setschedpolicy(&attr, SCHED_FIFO);
if(0 != ret)
{
printf("pthread_attr_setschedpolicy failed!\n");
return -1;
}
ret = pthread_attr_setschedpolicy(&attr1, SCHED_FIFO);
if(0 != ret)
{
printf("pthread_attr_setschedpolicy failed!\n");
return -1;
}
sched_prio.__sched_priority = 21;
ret = pthread_attr_setschedparam(&attr, &sched_prio);
if(0 != ret)
{
printf("pthread_attr_setschedparam failed!\n");
}
sched_prio.__sched_priority = 41;
ret = pthread_attr_setschedparam(&attr1, &sched_prio);
if(0 != ret)
{
printf("pthread_attr_setschedparam failed!\n");
}
ret=pthread_create(&task,&attr,(void *)pthread_task_fun,(void *)a);
if(0 != ret)
{
printf("pthread_create failed!\n");
}
ret=pthread_create(&task1,&attr1,(void *)pthread_task_fun,(void *)b);
if(0 != ret)
{
printf("pthread_create failed!\n");
}
pthread_attr_destroy(&attr);
pthread_attr_destroy(&attr1);
pthread_join(task,NULL);
pthread_join(task1,NULL);
return 0;
}
void pthread_task_fun(void *args)
{
char *p=(char *)args;
int i = 0;
while(i++<1000)
{
printf("%s\n",p);
}
}