pthread_setschedparam

 1 #include <stdlib.h>
 2 #include <pthread.h>
 3 #include <stdio.h>
 4 #include <sched.h>
 5 void *consumer(void *p)
 6  {
 7           int i;
 8           printf("start (%d)\n", (int)p);
 9          for (i = 0;1; i++)
10         {        
11                   //if(i%200 == 10)
12                    printf("<<<<<<<(%d)\n", (int)p);
13                         
14         }
15 }       
16  int main(int argc, char *argv[])
17  {
18          pthread_t  t1, t2, t3;
19          struct sched_param sched3;
20          sched3.__sched_priority = 70;
21         
22          pthread_create(&t1, NULL, consumer, (void *)4);
23          pthread_create(&t2, NULL, consumer, (void *)5);
24          pthread_create(&t3, NULL, (consumer), (void *)6);
25         sleep(8);
26         pthread_setschedparam(t3, SCHED_FIFO, &sched3);
27         pthread_join(t1, NULL);
28         pthread_join(t2, NULL);
29         pthread_join(t3, NULL);
30        return 0;
31  } 
32 //pthread_setschedparam在多线程开发中经常被使用的,它主要用于设置线程的调用策略和优先级。 
33 /* 运行结果:
34 前8秒交替打印 <<<<<<<<<<<<<<<<<<<<<(4)  和<<<<<<<<<<<<<<<<<<<<<(5)
35                 和 <<<<<<<<<<<<<<<<<<<<<(6)
36 8秒以后只打印 <<<<<<<<<<<<<<<<<<<<<(6)
37 
38 注意:如果t3线程用sleep()阻塞自己,其它线程将会被调度执行。
39 上面的程序在8秒后主线程(执行main)也不会执行,比如在29行增加一个exit(1),如果主线程会执行到29行,整个程序将结束,但实际上还会一直执行t3线程.主线程不会被执行。*/ 

 

这是一个使用 pthread 库的多线程程序,主要是创建一个线程并等待它的结束。下面是代码的详细解析: 1. `int main(int argc, char *argv[])`:程序的主函数。 2. `pthread_attr_t mtd_attr;`:定义线程属性对象 mtd_attr。 3. `pthread_attr_init(&mtd_attr);`:初始化线程属性对象 mtd_attr。 4. `pthread_attr_setinheritsched(&mtd_attr,PTHREAD_EXPLICIT_SCHED);`:设置线程属性对象 mtd_attr 的继承调度策略为 PTHREAD_EXPLICIT_SCHED。 5. `pthread_attr_setschedpolicy(&mtd_attr,SCHED_OTHER);`:设置线程属性对象 mtd_attr 的调度策略为 SCHED_OTHER。 6. `struct sched_param send_param; send_param.__sched_priority = 60;`:定义并设置调度参数对象 send_param 的优先级为 60。 7. `pthread_attr_setschedparam(&mtd_attr,&send_param);`:设置线程属性对象 mtd_attr 的调度参数为 send_param。 8. `pthread_attr_setscope(&mtd_attr,PTHREAD_SCOPE_SYSTEM);`:设置线程属性对象 mtd_attr 的作用域为 PTHREAD_SCOPE_SYSTEM。 9. `pthread_t mtd_thread;`:定义线程对象 mtd_thread。 10. `int mtd_task_id;`:定义线程 ID 变量 mtd_task_id。 11. `if((mtd_task_id=pthread_create((pthread_t *)(&mtd_thread),&mtd_attr,mtd_test,NULL))!=0)`:创建线程,并将其 ID 赋值给 mtd_task_id。其中,pthread_create() 函数的第一个参数是指向线程对象的指针,第二个参数是指向线程属性对象的指针,第三个参数是指向线程函数的指针,最后一个参数是线程函数的参数,这里设置为 NULL。 12. `printf("mtd_thread tid %d..\n",mtd_task_id);`:输出线程 ID。 13. `pthread_join(mtd_thread, NULL);`:等待线程结束,如果线程没有结束,主线程就会一直阻塞在这里。 14. `return 0;`:返回程序运行结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值