linux 线程 suspend resume 问题

zsyddl2 2008-05-10 11:08:24
不知道 哪位大侠知道linux 下面 线程的 暂停和 恢复 功能 如何控制. 这里的暂停和恢复 是指和windows 一样的 suspend resume功能可以由别的线程在任何时刻将线程挂起, 而不是用信号等阻塞的方式手动的在暂停点暂停..似乎没有能用的接口. 不知道哪位大侠有 办法实现 该功能.谢谢.
...全文
1240 29 打赏 收藏 转发到动态 举报
写回复
用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)

23,120

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧