社区
Linux/Unix社区
帖子详情
linux 线程 suspend resume 问题
zsyddl2
2008-05-10 11:08:24
不知道 哪位大侠知道linux 下面 线程的 暂停和 恢复 功能 如何控制. 这里的暂停和恢复 是指和windows 一样的 suspend resume功能可以由别的线程在任何时刻将线程挂起, 而不是用信号等阻塞的方式手动的在暂停点暂停..似乎没有能用的接口. 不知道哪位大侠有 办法实现 该功能.谢谢.
...全文
1240
29
打赏
收藏
linux 线程 suspend resume 问题
不知道 哪位大侠知道linux 下面 线程的 暂停和 恢复 功能 如何控制. 这里的暂停和恢复 是指和windows 一样的 suspend resume功能可以由别的线程在任何时刻将线程挂起, 而不是用信号等阻塞的方式手动的在暂停点暂停..似乎没有能用的接口. 不知道哪位大侠有 办法实现 该功能.谢谢.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
29 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
fianceeyi
2009-03-29
打赏
举报
回复
同问,操作系统将thread sleep 或者 suspend 之后采用什么机制,让它能够监听resume的动作???
zsyddl2
2008-05-13
打赏
举报
回复
经过几天的 查找有了一些结果. linux 的 进程 支持 suspend 和 resume.在linux 中 轻量级的进程作为进程使用.
发送
SIGSTOP SIGCONT信号 可以 控制一个 进程.
但是 pthread 中却 没有 这个 接口. 不知道 为什么. pthread 难道是 实现的用户级线程? 这个 等我下一个 pthread 的代码看看再说. 找到 一个叫做 C++ threads 的linux 线程库,该库实现了 suspend 和resume 接口,以及别的 很多线程接口.看了代码,确实是使用
SIG 信号 控制 线程的. 但是该库 并不能跨平台. 而 zthread 是一个可以跨平台的线程库,但在linux下面是基于pthread 实现的. 所以,有些麻烦了. 看看有 怎么 将zthread 库 修改以 实现 这两个功能接口.
fuqd273
2008-05-12
打赏
举报
回复
哈,谢谢。我也找到了。
fuqd273
2008-05-12
打赏
举报
回复
找到了,可以使用
int pthread_attr_setschedparam(pthread_attr_t *attr,
const struct sched_param *param);
int pthread_attr_getschedparam(const pthread_attr_t *attr,
struct sched_param *param);
来修改优先级。
具体可以参考
<sched.h>。
blackbillow
2008-05-12
打赏
举报
回复
[Quote=引用 21 楼 fuqd273 的回复:]
请教,优先级怎么设?我在查pthread_attr_t构造体ing
[/Quote]
http://www.yuanma.org/data/2006/0823/article_1392.htm
int pthread_attr_setschedparam(pthread_attr_t *attr, const struct sched_param *param);
int pthread_attr_getschedparam(const pthread_attr_t *attr, struct sched_param *param);
fuqd273
2008-05-12
打赏
举报
回复
完全实现相同功能很难,模拟类似功能很容易。
当然不是在所有语句后面加阻塞点,但是检查复杂运算,在合理位置增加阻塞点还是可行的。
既不在太过深入的地方增加,这可能导致阻赛检测太过频繁,影响性能;又要注意不能太少,以至于job单位过大,起不到job调度的作用。
建议而已。
fuqd273
2008-05-12
打赏
举报
回复
[Quote=引用 19 楼 blackbillow 的回复:]
楼主的意思是: 线程A 可以在任意时候suspend线程B?(如果理解不对请指正)
我有点迷惑了:如果在单处理器系统上,B正在运行,A 在就绪队列,A 怎么可能执行让Bsuspend的指令?
这个是OS进程调度的问题,你可以把后者的优先级设高一点,Linux支持内核抢占,而且没准前者在一个临界区内,你野蛮地suspend它肯定会出问题
[/Quote]
我查了下线程的相关
函数列表
没有发现类似suspend/resume 接口。
请教,优先级怎么设?我在查pthread_attr_t构造体ing
zsyddl2
2008-05-12
打赏
举报
回复
呵呵.当然 不是说 运行的时间片 内 将起 suspend.
你就理解为
A 线程可以 调度一下 B 线程.让B 在 之后可以暂停.
用过 windows 或者 macos 的 thread suspend 就 应该知道. 当然不用问这些 比较怪 的问题了.
blackbillow
2008-05-12
打赏
举报
回复
楼主的意思是: 线程A 可以在任意时候suspend线程B?(如果理解不对请指正)
我有点迷惑了:如果在单处理器系统上,B正在运行,A 在就绪队列,A 怎么可能执行让Bsuspend的指令?
[Quote=引用 14 楼 zsyddl2 的回复:]
当然. 但是 线程suspend 和resume 只是 os 系统的 一个实现. mac os 也有 这样的功能接口.
当用户 觉得 有更重要的 需要处理的 事情时, 也许决定 要将 某个 处于 高速 运算的线程暂停一会儿. 处理之后,让其继续刚才的运算.
我需要这个功能当然不是无中生有.
[/Quote]
这个是OS进程调度的问题,你可以把后者的优先级设高一点,Linux支持内核抢占,而且没准前者在一个临界区内,你野蛮地suspend它肯定会出问题
zsyddl2
2008-05-12
打赏
举报
回复
pthread_cond_wait x需要 你在 线程运行过程中 增加 类似 的阻塞点...不可能在一个 复杂运算中去为每个语句增加一个 暂停点把....
而真正的 suspend 是 可以在任何时刻 起作用的, 比如 你正在处于 一个 复杂的 矩阵运算中. 这个时候 出于 某个需要的原因 需要暂停 该 运算,以让出 cpu 时间. 如果 能暂停, 过一会儿再次恢复 以继续计算. 这样的 suspend 应该就是 让 os 的 调度器 停止 对 该线程的时间片 分配.
fuqd273
2008-05-12
打赏
举报
回复
也许 线程suspend 和resume 更简单直观,但是并不是使用pthread_cond_wait 或者别的方式 就无法实现类似功能。
要区别效率的话,要深入到机器码的实现上才能有答案了。
不过,mark一下,我也要研究下,unix/linux下到底有没有类似的实现了……
zsyddl2
2008-05-12
打赏
举报
回复
并不是为了代码移植....
zsyddl2
2008-05-12
打赏
举报
回复
感谢你的 热情支持.
zsyddl2
2008-05-12
打赏
举报
回复
当然. 但是 线程suspend 和resume 只是 os 系统的 一个实现. mac os 也有 这样的功能接口.
当用户 觉得 有更重要的 需要处理的 事情时, 也许决定 要将 某个 处于 高速 运算的线程暂停一会儿. 处理之后,让其继续刚才的运算.
我需要这个功能当然不是无中生有.
fuqd273
2008-05-12
打赏
举报
回复
小声地问一句,就为了移植的代码修正量少一点这个原因么?
fuqd273
2008-05-12
打赏
举报
回复
[Quote=引用 9 楼 zsyddl2 的回复:]
要求已经说过 "这里的暂停和恢复 是指和windows 一样的 suspend resume功能可以由别的线程在任何时刻将线程挂起"
不是 要解决 程序设计问题!是要解决 一个 功能问题. 不知道 楼上是否使用过 windows 的suspend 和resume 函数?
[/Quote]
抱歉,我没使用过windows 的suspend 和resume 函数。
但是我认为,软件的功能和你使用的具体技术的关联性不能说没有,但是甚少。
抱歉,浪费你的时间来跟我解释这些基础问题了。
zsyddl2
2008-05-12
打赏
举报
回复
拜托 用中文. 我英文不好.
fuqd273
2008-05-12
打赏
举报
回复
[Quote=引用 6 楼 zsyddl2 的回复:]
这个 是不同的概念.
pthread_cond_wait 是在 本 线程自己调用,之后挂起.
相当于手动加了 挂起 点, suspend 的功能是 别的线程对 该线程的操作. 不需要 挂起 点,任何时刻可以将线程挂起.
将 其 从 cpu 的调度中 调出,不再分配cpu时间. 看来只能我 自己试试了. linux系统坏了.等安装好了. 试试看看信号SIGSTOP是否 达到要求了.
[/Quote]
FROM MSDN:
Why you should never suspend a thread
threadsafe?
zsyddl2
2008-05-12
打赏
举报
回复
要求已经说过 "这里的暂停和恢复 是指和windows 一样的 suspend resume功能可以由别的线程在任何时刻将线程挂起"
不是 要解决 程序设计问题!是要解决 一个 功能问题. 不知道 楼上是否使用过 windows 的suspend 和resume 函数?
fuqd273
2008-05-12
打赏
举报
回复
[Quote=引用 3 楼 zsyddl2 的回复:]
楼上 错误.
我说过 不是用信号量 阻塞.这个 是不能满足功能的. 如此简单我就不会来问了. 所以 回答 也仔细一点.
少许地方说过用 kill 发送
SIGSTOP,和
SIGCONT 可以 挂起和 恢复一个线程. 不过似乎 有些问题. 我自己试试看.合适的话把代码给大家.
[/Quote]
建议提出具体要求,简单地说信号量和阻塞不能满足你的要求,让人没办法回答你。
加载更多回复(9)
深入探讨
Linux
Kernel
suspend
/re
sum
e 过程的实现原理和相关技术
如果检查没
问题
, 接 下来休眠所有的系统设备和总线, 并且调用
suspend
_pos->enter() 来使CPU进入 省电状态. 这时候,就已经休眠了.代码的执行也就停在这里了。到这里, 所有的休眠和唤醒就已经完毕了, 系统继续运行了...
Linux
电源管理——系统
Suspend
/Re
sum
e流程
本文主要介绍在
linux
-4.14内核中,系统的
suspend
/re
sum
e流程
Android&
Linux
系统
suspend
/re
sum
e机制
Linux
内核提供了多种休眠(休眠)方式:freeze(idle)、standyby、STR(
suspend
to ram)和STD(
suspend
to disk),这些休眠方式通过文件节点/sys/power/state提供给用户操作,在用户空间通过向/sys/power/state...
暂停
线程
suspend
()和恢复
线程
re
sum
e()
2、使用re
sum
e()方法恢复
线程
: 阻塞->就绪
suspend
() 和 re
sum
e() 被用在等待另一个
线程
产生的结果的情 形:测试发现结果还没有产生后,让
线程
阻塞,另一个
线程
产生了结果后,调用 re
sum
e() 使其恢复。但
suspend
()...
多
线程
之暂停与恢复
suspend
和re
sum
e
一:简介 暂停
线程
意味着此
线程
还... 通过
suspend
()使
线程
进入停滞状态后,除非收到re
sum
e()消息,否则该
线程
不会变回 可执行状态。注意如果在
线程
没有挂起时(就是没有调用
suspend
()方法前)去调用 Re
sum
e()...
Linux/Unix社区
23,120
社区成员
74,507
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章