macOS 的 Emacs 30-31 make-thread 有卡死可能

Make thread 后不会马上执行,而是要很久或者主动 thread-yield 才有效果

另外在其他 thread 里调用 epg 也会卡死整个 Emacs

有 thread 相关改动。

大概可以看看八九月的 bug-gnu-emacs

1 个赞

第二个问题可能和这个一月的bug有关

1 个赞

才知道有这个函数,实际使用起来如何,可以实现多线程计算,不卡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 其实是动态作用域的吧,在里面创建的线程实际执行的时候已经逃逸出作用域了

但是正常插入到 buffer 中了。你的意思是动态作用域会导致文本插入到当前执行代码的buffer嘛?

因为currentbuffer实际上是个内部的变量,逃逸了以后还是保留了新的值,中间你没有运行其他的 with-current-buffer,看起来是正常工作了,但是这样在线程外改变默认buffer是不安全的 (也许,我猜的)

1 个赞

我发现 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,还想用它整点花活来着 :joy:

那就是上面的 bug75275 导致的,目前还没修好。

1 个赞

你们不觉得 make-thread 很难用吗?

难不成有哪个线程的API好用的?

单核多线程本身就很局限,只能带着镣铐跳舞,但总比没有好。我昨天在windows上试了一下,结合 add-variable-watcher,可以用来实现动画效果,不卡emacs。

1 个赞