线程安全的承诺让我被 Fyne(以及 Go)所吸引。但是现在我在阅读 Go 方面变得更好了,我看到一些事情让人相信 API 作为一个整体不是线程安全的,也许从来没有打算这样做。所以我试图确定 Fyne 中“线程安全”的含义。
我专门看
func (l *Label) SetText(text string) {
l.Text = text
l.textProvider.SetText(text) // calls refresh
}
并注意到 l.Text 也是一个字符串。Go 中的赋值不是线程安全的,所以对我来说很明显,如果两个线程争夺标签的文本并且同时调用 label.SetText,我可以预料到内存损坏。
“但你不会那样做”,有人可能会说。不,但我担心有人编辑条目的内容,而应用程序线程决定它需要替换所有条目的文本 - 这在我的应用程序中是完全可能的,因为它支持多个用户通过网络同时编辑,所以各种小部件的更新都是异步的。(注意我不关心如果两个人同时编辑同一个条目会发生什么;某人的更改将会丢失,我不在乎谁是。但它一定不会导致内存损坏。)请注意,我可以使用一种方法采取的做法是让后台线程创建一个全新的 Entry 小部件,然后替换当前 Box 中的那个。但是那个线程安全吗?
并不是我不知道如何用通道序列化事物。但我希望 Fyne 会消除对它的需求(一篇博客文章声称它确实如此);即使使用通道,我也无法说服自己,当某个后台线程正在更改、隐藏它等时,用户以各种方式干预小部件不会导致崩溃。也许所有这些都在幕后序列化并且非常安全,但我不想找出它不是的困难方式,因为我无法修复它。
Fyne 显然是相当新的并且似乎有很多承诺,但文档似乎对细节很轻。是否有更多信息可以在某处获得?人们有没有成功地尝试过这个?