我已经搜索了该网站和Math.Net 2网站,但找不到任何有关线程安全性的确定信息。
MathNet对象线程安全吗?例如,如果我创建一个对象
MathNet.Numerics.LinearAlgebra.Matrix
要么
MathNet.Numerics.LinearAlgebra.Vector
可以使用MathNet函数,例如来自我应用程序中多个线程的Add()
,At()
等?像MathNet.Numerics.Control.UseMultiThreading()
这样的东西怎么样?
需要明确的是,我并不是在问MathNet函数中的多线程问题,而是在使用我的应用程序中创建的多个线程来查询对象本身的线程安全性。
谢谢
答案 0 :(得分:0)
如果您查看source for the backing storages(DenseVectorStorage
,SparseVectorStorage
和与Matrix相关的存储),它们将使用简单的数组来存储索引和数据,而无需进行线程安全检查
例如SparseVectorStorage.At()
包含一个简单的return itemIndex >= 0 ? Values[itemIndex] : Zero;
缺乏线程安全性是可以理解的,因为该库旨在提高速度,并且用户可以随意放慢速度并在需要时自行添加线程安全性。
关于您对Control.UseMultiThreading()
的问题(及其缺少文档),这似乎主要用于加快计算速度,尤其是因为线性代数计算的本质是高度可并行化的,而无需修改现有结构