一个int就能lock thread, 俺十分的怀疑

发布于 2022-10-15 08:47:27 字数 595 浏览 19 评论 0

刚才看一个小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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

打小就很酷 2022-10-22 08:47:27

++global_int 原子吗?不然需要关中断

小ぇ时光︴ 2022-10-22 08:47:27

本帖最后由 nketc 于 2011-04-23 00:17 编辑

`                                                                                                                                                                                                 `

蓝色星空 2022-10-22 08:47:27

要是它中断不嵌套 没啥问题。
nketc 发表于 2011-04-23 00:13

    中断不嵌套,++, --非原子。
俺睁大眼睛想找个问题来,没有找到。

爱她像谁 2022-10-22 08:47:27

本帖最后由 pagx 于 2011-04-23 00:19 编辑

这个单核下是没有什么问题的。
因为
1、CPU是按流程执行的。
2、X86的CPU是不允许中断一条指令的执行的。
注: SMP下1是不成立的。

这里的锁定,只是让调度部分的代码不去执行调度而已。并非是不执行中断例程。

反目相谮 2022-10-22 08:47:27

不错不错,楼主强大。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文