Make thread 后不会马上执行,而是要很久或者主动 thread-yield 才有效果
另外在其他 thread 里调用 epg 也会卡死整个 Emacs
Make thread 后不会马上执行,而是要很久或者主动 thread-yield 才有效果
另外在其他 thread 里调用 epg 也会卡死整个 Emacs
有 thread 相关改动。
大概可以看看八九月的 bug-gnu-emacs
第二个问题可能和这个一月的bug有关
才知道有这个函数,实际使用起来如何,可以实现多线程计算,不卡emacs嘛?
你可以理解为单核多线程。26就有了。不过如我所说的,做单纯的计算可能还好,一旦涉及到和其他进程交互,以前能正常工作的代码用上最近的master分支有卡住emacs的问题
这个是不是对和emacs元素交互相关的操作无效,只能做纯计算?
下面的测试代码,没有在buffer中插入文本:
(with-current-buffer "test-thread"
(make-thread
(lambda ()
(insert "test-thread"))))
如何才能触发执行?
let b current-buffer
make-thread [lambda () with-buffer b
insert "text"]
然后调用 thread-yield,不然在 31 就要放置一段时间才会切换线程
你估计不知道到 with-current-buffer 其实是动态作用域的吧,在里面创建的线程实际执行的时候已经逃逸出作用域了
因为currentbuffer实际上是个内部的变量,逃逸了以后还是保留了新的值,中间你没有运行其他的 with-current-buffer,看起来是正常工作了,但是这样在线程外改变默认buffer是不安全的 (也许,我猜的)
我发现 make-thread 在 MacOS 下用不了(Windows 下没问题),一执行就卡死了,稳定复现。我是 Apple M1,GNU Emacs 30.2 (build 1, aarch64-apple-darwin21.6.0, NS appkit-2113.60 Version 12.6.1 (Build 21G217)) of 2025-08-15
,还想用它整点花活来着
那就是上面的 bug75275 导致的,目前还没修好。
你们不觉得 make-thread 很难用吗?
难不成有哪个线程的API好用的?
单核多线程本身就很局限,只能带着镣铐跳舞,但总比没有好。我昨天在windows上试了一下,结合 add-variable-watcher
,可以用来实现动画效果,不卡emacs。