免费注册 查看新帖 |

Chinaunix

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

[C++] linux/win32中线程挂起/唤醒的一些细节问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-07-13 10:46 |只看该作者 |倒序浏览
线程的挂起/唤醒有两种“看起来效果一样”的实现方式:


1、当线程被挂起的时候,os不为该线程分配时间片,直到该线程被唤醒

2、“挂起”的线程实际上是在执行一个有条件无限循环,在该循环之外时就被视为“唤醒”状态



我想知道linux/win32对线程挂起/唤醒的系统调用都有哪些函数?它们各自采用的是上面哪种方式?


并不是有具体的应用问题,只是想了解两个主流 os 在这方面的实现和各自的接口,或者有没有已经实现了将os dependent的内容已经包装好了的第三方库?

论坛徽章:
0
2 [报告]
发表于 2008-07-13 11:17 |只看该作者
win32不清楚,但是linux下如果使用一个无限循环来挂起线程的话过于浪费。会损耗cpu资源。
最好的办法是使用pthread库里面的条件变量和互斥锁,让线程等待在一个条件上。
这种方式应该就是你上面提到的第一种方式。

用到的函数主要在pthread.h里面,大概有以下几个(需要配合使用):
pthread_cond_init
pthread_mutex_init
pthread_cond_wait
pthread_cond_signal
pthread_mutex_lock
pthread_mutex_unlock
pthread_cond_detroy
pthread_mutex_destroy

[ 本帖最后由 hillking 于 2008-7-13 11:28 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2008-07-13 11:23 |只看该作者
2、“挂起”的线程实际上是在执行一个有条件无限循环,在该循环之外时就被视为“唤醒”状态


另外我觉得你这个说法有很大的问题,很多服务线程在无限循环里面实际上也是“唤醒”状态,这些线程大部分是在
论询执行的条件是否成熟。我个人认为,线程如果在使用cpu资源,实际就是在唤醒状态。

论坛徽章:
0
4 [报告]
发表于 2008-07-13 11:39 |只看该作者
原帖由 hillking 于 2008-7-13 11:23 发表


另外我觉得你这个说法有很大的问题,很多服务线程在无限循环里面实际上也是“唤醒”状态,这些线程大部分是在
论询执行的条件是否成熟。我个人认为,线程如果在使用cpu资源,实际就是在唤醒状态。


所以我打了引号,并且一开始说的是“看起来一样”。上面的第2种做法实际上在很多地方都是还可以见到的,尤其是一些质量要求不是很严格的公司的项目里。


pthread 是 linux 等遵循 posix 的 os 都支持的,但是在win32里并没有这玩意儿,所以直接使用 pthread 没有跨平台的能力

论坛徽章:
0
5 [报告]
发表于 2008-07-13 12:12 |只看该作者
win32是个畸形的特例,不能在win32上使用,不能说没有跨平台能力。
恰恰相反,遵循posix标准的库,跨平台能力是最强的。

论坛徽章:
0
6 [报告]
发表于 2008-07-13 13:46 |只看该作者
好罢,我主要是说能够在 win32/linux 上通用……

论坛徽章:
0
7 [报告]
发表于 2008-07-13 16:55 |只看该作者

回复 #6 wsz123 的帖子

在windows下,可以用_beginthreadex模拟pthread_create,然后用WaitForSingleObject模拟pthread_cond_wait,用CriticalSection模拟pthread_mutex_t。

跨平台不是问题。

论坛徽章:
0
8 [报告]
发表于 2008-07-14 00:05 |只看该作者
pthread_cond_wait 和 WaitForSingleObject 都是在os的线程调度管理中被挂起的么?还是其实是在执行轮询?

论坛徽章:
0
9 [报告]
发表于 2008-07-14 11:27 |只看该作者
原帖由 wsz123 于 2008-7-14 00:05 发表
pthread_cond_wait 和 WaitForSingleObject 都是在os的线程调度管理中被挂起的么?还是其实是在执行轮询?


按文档上说pthread_cond_wait 是真正挂起,但是不知道不同平台的具体实现是否不一样。

WaitForSingleObject 这个不清楚

论坛徽章:
0
10 [报告]
发表于 2008-07-14 11:47 |只看该作者
做个通用的可以把win32和linux的线程函数包装一下,写个统一的借口,但调用各自平台的函数。 我试过了


小马哥寒舍http://www.mawudi.cn
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP