免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11767 | 回复: 15
打印 上一主题 下一主题

[函数] 实践发现sleep不会让出cpu! [复制链接]

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-07 15:03 |只看该作者 |倒序浏览
本帖最后由 cxytz01 于 2013-04-07 18:23 编辑

三线程程序,本以为线程内sleep会导致该线程阻塞,进而让出cpu。结果近日无意发现,竟然没有让出。而是继续占有cpu(因为sleep期间,其他线程没有打印出信息)。

流程:
AGAIN:
     请求资源
     if (请求资源成功) {

        printf("请求资源成功\n");
        /* do something */

     } else (请求资源失败) {
        
        printf("请求资源失败\n");
        sleep(1);
        goto AGAIN;

     }

一旦进入if语句块二,请求资源失败语句会持续打印5~6次,才会转到其他线程执行。



os: Linux XXXXX 2.6.18-194.el5 #1 SMP Fri Apr 2 14:58:14 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

改用pthread_yield(),效果如何,尚待验证。

不知道pthread_yield()为什么无法在man中找出,不解。 历史原因? 废弃函数?


论坛徽章:
36
子鼠
日期:2013-08-28 22:23:29黄金圣斗士
日期:2015-12-01 11:37:51程序设计版块每日发帖之星
日期:2015-12-14 06:20:00CU十四周年纪念徽章
日期:2015-12-22 16:50:40IT运维版块每日发帖之星
日期:2016-01-25 06:20:0015-16赛季CBA联赛之深圳
日期:2016-01-27 10:31:172016猴年福章徽章
日期:2016-02-18 15:30:3415-16赛季CBA联赛之福建
日期:2016-04-07 11:25:2215-16赛季CBA联赛之青岛
日期:2016-04-29 18:02:5915-16赛季CBA联赛之北控
日期:2016-06-20 17:38:50技术图书徽章
日期:2016-07-19 13:54:03程序设计版块每日发帖之星
日期:2016-08-21 06:20:00
2 [报告]
发表于 2013-04-07 15:45 |只看该作者


楼主还是上代码大家挑错吧

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
3 [报告]
发表于 2013-04-07 16:08 |只看该作者
哈哈,啊哈哈。

代码就不上了,我自己写的代码,有没有错,自己明白。

cokeboL 发表于 2013-04-07 15:45
楼主还是上代码大家挑错吧

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
4 [报告]
发表于 2013-04-07 16:56 |只看该作者
sleep(x)的x不会是0吧?

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
5 [报告]
发表于 2013-04-07 17:14 |只看该作者
擦,哥哥啊,这么幼稚的错误是不会犯的。
w_anthony 发表于 2013-04-07 16:56
sleep(x)的x不会是0吧?

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
6 [报告]
发表于 2013-04-07 17:35 |只看该作者
回复 5# cxytz01


    你的实践结果和我曾经的实践结果相差甚远,无码无真相

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
7 [报告]
发表于 2013-04-07 20:10 |只看该作者
首先LZ的观察结果和sleep会不会让出CPU根本是两回事...
其次sleep肯定会让出CPU.

假设你的三个线程在同一运行队列, 也即, 在内核中在同一物理CPU上. 设三个线程分别为A B C. A sleep, 意味着线程A阻塞, 内核立即将该线程放入等待队列, 绝对不会占用CPU是肯定的. 但是接下来内核是不是就调度到 B 和 C 呢? 这是未知的. 更加未知的事情是, 即使切换到了线程 B 和 C, 线程 B 和 C 的资源请求一定是成功的? 如果B 和 C资源请求不成功, 那线程 B 和 C 不一样去sleep嘛按照你的代码逻辑? 所以首先你的观察结果和sleep会不会让出CPU是两回事, 其次sleep肯定会让出CPU, 这是由内核实现决定的.
另外无代码无真相, 别对自己那么自信谢谢.

论坛徽章:
3
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亚洲杯之阿曼
日期:2015-04-07 20:00:59
8 [报告]
发表于 2013-04-07 20:16 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
9 [报告]
发表于 2013-04-07 20:24 |只看该作者
楼上的各位说的也是,有时间我贴下代码,代码太长。果然是no picture, you say a ...

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
10 [报告]
发表于 2013-04-07 20:25 |只看该作者
本帖最后由 cxytz01 于 2013-04-07 20:26 编辑

代码长了。贴不上
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP