问题标签 [fibers]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - Stackful coroutines + gdb = "此帧内部的前一帧(损坏的堆栈)?"
我正在编写一些代码来调试使用 Boost.Contextmake_fcontext
和的堆栈协程jump_fcontext
,并且遇到了一个小问题。
通常不可能backtrace
越过堆栈协程的入口,因为它在自己的堆栈上执行。这意味着我无法从调试器中确定协程是从哪里输入的。然而,这不是我要问的问题。我已经通过在传递给的函数中添加一些内联汇编和 DWARF 字节码解决了这个问题make_fcontext
:
这确实有效,我现在backtrace
可以在调用者中启动或恢复内部协程的点 - 但只是有时。
事实证明,gdb 有一个“健全性检查”:如果堆栈指针在调用帧之间以“错误”的方向移动,gdb 假定堆栈已损坏并使用消息“ Backtrace stopped: previous frame inner to this frame (corrupt stack?)
”停止跟踪。
当我的堆栈以某种方式分配时,这会触发,但不会以其他方式。我什至对静态分配的堆栈进行了测试,当以正向使用时会触发此故障,但在反向使用时不会触发此故障。
我什至在这里找到了执行此检查的 gdb 源代码部分:https ://github.com/bminor/binutils-gdb/blob/master/gdb/frame.c#L737-L816
现在这是我的实际问题:我该如何解决这个问题?
是否有一些我可以写的汇编咒语告诉 GDB“相信我,我知道我在做什么”?
c - 从不同的纤程调用需要主线程的函数
有很多函数应该从主线程调用。以我有限的经验,这些主要是 UI 功能。
例子:
假设我有一个使用设置/获取上下文创建“线程”的光纤库。从主操作系统线程开始的任何光纤调用仅主线程函数是否安全?
我认为这很好,因为操作系统不知道我的纤维,但我不确定。我会对此进行测试,但结果不会是明确的,因为它可能有效但依赖于未定义的行为。
编辑:将此问题标记为 C,因为 set/get context 是 C 函数,尽管如评论中所述,我认为它也可能适用于用其他语言编写的程序。
c - C 的 Windows 中 Fibers 的正确用法是什么?
我最近对 Windows 中的 Fibers 很感兴趣,但我很难使用它。该文档涉及函数定义和一些示例,但我仍然不清楚一些东西。我看到CreateFiber
定义被定义为:
因此,我们指定堆栈大小、纤程的函数以及可能的函数参数。现在,我的问题是:
1)一旦创建了纤程,我假设提供的功能执行不会立即开始,对吗?我相信需要先打电话ConvertThreadToFiber
。但是还有其他需要做的事情吗?我的意思是在最简单的情况下,定义、启动、运行和删除一个简单的纤程是什么样子的?
2)是否有可能以某种方式检查我们是否真的在光纤中?我的意思是 Fiber 是否在应用程序的其他部分执行?如果是,如何?
3)是否有可能在我们希望的任何时刻获取光纤堆栈的内存位置和光纤堆栈的实际内容?如果是,如何?
crystal-lang - 输出当前光纤,直到 FD 有一些数据
在通过 FFI 使用 C 库的晶体程序中,我有从文件描述符读取时阻塞的代码。在该文件描述符有一些数据之前,我如何才能产生光纤?
例如,当前代码类似于:
WhereLibFoo.read
阻塞,直到 socket/pipe-like 对象有一些数据。我用什么代替yield_until_fd_has_data
?
c++ - 我对 Windows 中的纤维有一些疑问
我想知道window提供的光纤。
假设我创建了 4 个纤维。
- - - - - - 线 - - - - - - - - -
纤维1 - 纤维2 - 纤维3 - 纤维4
^
Fiber 1 现在线程执行。
一个线程只能同时运行一根光纤。这是正确的?
如果一个线程终止了 Fiber1,那么另一个所有的 Fiber 也会终止吗?
我知道光纤是非抢占式的。那么如果我想将fiber1切换到fiber2,有没有办法只能在fiber1中调用SwitchToFiber呢?
如果我在执行某些任务期间在 Fiber1 中调用 SwitchToFiber,那么 Fiber1 会立即休眠吗?还是完成任务后睡觉?
光纤1到光纤4没有共享空间?
而且没有共享空间,也就没有必要锁定光纤。这是正确的?
我阅读了 MSDN 文档,但我无法理解某些内容。所以我在这里问。
c++ - 在一个线程中为多个消费者异步读取一个套接字
我正在实现一个连接多路复用器 - 类,它包装单个连接以提供在其上创建所谓的Stream
-s 的能力。在一个物理连接上可以有几十个这样的流。
通过该连接发送的消息由协议定义,可以是服务消息(拥塞控制等),客户端永远不会看到这些消息,也可以是数据消息 - 它们包含流的一些数据,其中一个 - 在标头中定义的相应消息。
我在read
为Stream
. 它必须是阻塞的,但异步的,以便它返回一些值 - 数据读取或发生错误 - 但请求本身必须是某种异步队列。
为了实现异步网络 IO,我们使用了 Boost 的async_read
-s、async_write
-s 等和完成令牌,这些令牌取自另一个库。因此,按照我之前描述的术语,调用MyConnection::underlying_connection::read(size_t)
已经是异步的。
我实现的一种解决方案是 function MyConnection::processFrame()
,它从连接中读取,处理消息,如果是数据消息,则将数据放入相应流的缓冲区中。该函数while
将由流的read
. 但是,在这种情况下,可以同时调用多个async_read
UB,即 UB。此外,这意味着即使是服务消息也要等到某个流想要读取数据,这也是不合适的。
我想出的另一个解决方案是使用future
-s,但是当我检查时,他们的方法wait/get
会阻塞整个线程(即使使用延迟策略或配对承诺),这也必须避免。
下面是一个简化的示例,其中仅包含理解问题所需的方法。这是当前的实现,其中包含错误。
感谢您未来的答案!
reactjs - react 如何决定何时刷新所有批量更新?
由于react会将所有
setState
in event handler排入一个队列,如果event handler中有很大的for循环,react会等待循环吗?如果 setState 没有发生在事件处理程序中,比如 in
componentDidMount
,它什么时候会被刷新?
所以我的问题是,How react decides when to flush all the batched updates? What's the strategy?
javascript - Meteor bundle 无法运行命令:node main.js
我已经meteor build
在我的一个 meteorJS 应用程序中运行,然后提取了捆绑包,npm install
在程序/服务器中运行后,当我尝试node main.js
在根折叠中运行时遇到错误
我试图搜索名为 topologies 的 npm 包来添加它,但没有找到
我尝试运行node main.js
但它失败并引发错误
我曾预计该应用程序会运行,但我收到此错误:
parallel-processing - Does CRYSTAL_WORKERS defaulting to 4 seem too low for a Crystal-lang app? Anyone else benchmark higher?
I am very happy that Crystal-lang now has multithreading. Has anyone else done some multi-threaded benchmarking for Crystal-lang; if so, what CRYSTAL_WORKERS have you seen to be beneficial for what you benchmarked? (Yeah, I know, every benchmark is different, so mileage may vary.)
The default for CRYSTAL_WORKERS is 4, but it seems like it should be more, at least on higher-core systems. Could the benchmarks that lead to that 4
value possibly be tied to a side-effect of the number of cores used at the time or something else?
I did some Fibonacci comparisons on an 8-core (Intel) and a 16-core (AMD) CPU and got some large peaks and valley patterns ( https://github.com/drhuffman12/bench_vs/blob/master/threads/README.md ). (For simple calculations/transformations, the overhead of fibers/etc seem to not be worth it; but for more computationally-intensive code, like Fibinacci calcs, fibers w/ higher CRYSTAL_WORKERS values and same_thread: false
seemed to potentially helpful.)
javascript - 缺少 /node_modules/fibers/bin/linux-x64-v8-7.6/fibers.node `。尝试重新安装“node-fibers”?
我在启动使用 demeteorizer 创建的流星包时遇到问题。当我尝试启动捆绑包时,出现如下所示的错误。
节点V:0.10.40,纤维V:1.0.1
我试图npm uninstall
纤维和npm install
他们再次。
这是我的错误:
/home/light-tech/Documents/demetorized-welcome-bar/bundle/programs/server/node_modules/fibers/fibers.js:13 throw new Error('
'+ modPath+ '.node
is missing. Try reinstallingnode-fibers
?'); ^错误:
/home/light-tech/Documents/demetorized-welcome-bar/bundle/programs/server/node_modules/fibers/bin/linux-x64-v8-7.6/fibers.node
丢失。尝试重新安装node-fibers
? 在对象。(/home/light-tech/Documents/demetorized-welcome-bar/bundle/programs/server/node_modules/fibers/fibers.js:13:8) 在 Module._compile (internal/modules/cjs/loader.js:936 :30) 在 Object.Module._extensions..js (internal/modules/cjs/loader.js:947:10) 在 Module.load (internal/modules/cjs/loader.js:790:32) 在 Function.Module ._load (internal/modules/cjs/loader.js:703:12) 在 Module.require (internal/modules/cjs/loader.js:830:19) 在 require (internal/modules/cjs/helpers.js:68 :18) 在对象处。(/home/light-tech/Documents/demetorized-welcome-bar/bundle/programs/server/boot.js:1:13) 在 Module._compile (internal/modules/cjs/loader.js:936:30) 在Object.Module._extensions..js (internal/modules/cjs/loader.js:947:10) npm ERR!代码 ELIFECYCLE npm 错误!errno 1 npm 错误!流星开发捆绑@0.0.0 开始:node ../../main
npm 错误!退出状态 1 npm ERR!npm 错误!在 meteor-dev-bundle@0.0.0 启动脚本处失败。npm 错误!这可能不是 npm 的问题。上面可能有额外的日志输出。npm 错误!可以在以下位置找到此运行的完整日志:npm ERR!
/home/light-tech/.npm/_logs/2019-11-08T12_34_41_274Z-debug.log