c++ - c/c++可以在单个线程中进行抢占式多任务处理吗?

标签 c++ c thread-safety green-threads

<分区>

抢占式 C/C++ 中的多任务处理:正在运行的线程能否被某个计时器中断并在任务之间切换?

许多使用绿色线程等的 VM 和其他语言运行时都是在这些术语中实现的; C/C++ 应用程序可以做同样的事情吗?

如果是,怎么做到的?

这将取决于平台,因此请根据特定平台对此的支持进行讨论;例如如果您可以在 Linux 上的 SIGALRM 处理程序中使用一些魔法来交换某种内部堆栈(也许使用 longjmp?),那就太好了!


我问是因为我很好奇。

多年来,我一直致力于制作异步 IO 循环。在编写异步 IO 循环时,我必须非常小心,不要将昂贵的计算放入循环中,因为它会 DOS 循环。

因此,我对可以使异步 IO 循环恢复甚至完全支持某种绿色线程或此类方法的各种方式很感兴趣。例如,在 SIGALRM 中对事件任务和循环迭代次数进行采样,然后如果检测到任务正在阻塞,则将所有其他所有内容移至新线程,或者一些巧妙的变体在此得到预期的结果。

在这方面对 node.js 有一些提示 recently ,以及其他地方,我看到了关于其他运行时的诱人评论,例如 Go 和 Haskell .但是,让我们不要离你是否可以在 C/C++ 中的单线程中执行抢占式多任务处理这一基本问题太远

最佳答案

Windows 具有纤程,它们是用户计划的执行单元,共享同一线程。 http://msdn.microsoft.com/en-us/library/windows/desktop/ms682661%28v=vs.85%29.aspx

UPD:关于 user-scheduled 上下文切换的更多信息可以在 LuaJIT 源代码中找到,它支持不同平台的协程,因此即使您不使用 lua,查看源代码也会很有用全部。这是摘要:http://coco.luajit.org/portability.html ,

关于c++ - c/c++可以在单个线程中进行抢占式多任务处理吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7943992/

相关文章:

c - 从C读取Excel文件

c - c中的十六进制到ASCII

c++ - 线程安全标准 :list C++

c++ - 如何从 PowerShell 获取 CreateTransaction 地址

c++ - 两个 std::arrays 的交叉部分

c++ - 使用 Uncrustify 格式化构造函数成员初始化

ios - 我们如何快速使 'static' 变量线程安全?

c++ - Win32 并在 WindowProcedure 外捕获 WM_SIZE 消息

c - 将windows中的linux静态库与cygwin链接起来

c++ - Qt 信号和槽线程安全