一个int就能lock thread, 俺十分的怀疑
刚才看一个小os,发现一个很有趣的事情,
用一个int, 就可以实现防止“线程切换”的工作。
我下意识的以为这种代码必有bug,想了半天,却没发现什么问题。
大家以为如何?
volatile int global_int = 0;
#define SCHEDULE_LOCK ++global_int
#define SCHEDULE_UNLOCK --global_int
中断里负责线程调度的代码,检查global_int == 0, 才进行切换。
void switch_thread_context()
{
if(global_int == 0)
{
//切换到下一个线程
}
}
线程中,要防止自己被调度出去,只要加保护如下:
SCHEDULE_LOCK;
...//这中间不会被调度
SCHEDULE_UNLOCK;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
++global_int 原子吗?不然需要关中断
本帖最后由 nketc 于 2011-04-23 00:17 编辑
` `
中断不嵌套,++, --非原子。
俺睁大眼睛想找个问题来,没有找到。
本帖最后由 pagx 于 2011-04-23 00:19 编辑
这个单核下是没有什么问题的。
因为
1、CPU是按流程执行的。
2、X86的CPU是不允许中断一条指令的执行的。
注: SMP下1是不成立的。
这里的锁定,只是让调度部分的代码不去执行调度而已。并非是不执行中断例程。
不错不错,楼主强大。