您的位置:首页 > 其它

线程详解

2016-05-18 17:25 253 查看
//线程详解

设置调度方式

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);

 }

 

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: