对于Swift-惰性var线程安全吗?感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于++运算符线程安全吗?、c#–RestSharp线程安全吗?、C#静态构造函数线程安全吗?、C#数组线
对于Swift-惰性var线程安全吗?感兴趣的读者,本文将提供您所需要的所有信息,并且为您提供关于++运算符线程安全吗?、c# – RestSharp线程安全吗?、C# 静态构造函数线程安全吗?、C#数组线程安全吗?的宝贵知识。
本文目录一览:Swift-惰性var线程安全吗?
也许这个问题需要一些上下文。
我一直在使用Core Data在持久层上进行工作,发现Core
Data不是线程安全的,因此仅需要NSManagedObjectContext
限制在每个线程中。
因此,我的方法是创建自定义后台线程NSManagedObjectContext
,以执行获取,保存等操作,同时还要创建主线程NSManagedObjectContext
,该线程将用于NSManagedObject
从获取的线程中获取NSManagedObjectId
并将其传递给调用者方法。
默认情况下,Xcode的生成与核心数据模板的代码中使用lazyvar
的所有NSManagedObjectContext
,NSManagedObjectModel
等等。
所以我的问题是是否
使用lazy var
实例化方法来创建NSManagedObjectContext
,前提是lazyvar
为每个尝试访问的线程初始化一个对象(不是线程安全的吗?)
要么
NSManagedObjectContext
在每个线程中声明单独的变量,并使所有与线程相关的方法引用两个不同的变量NSManagedObjectContext
,它们lazyvar
是线程安全的(?),并且在访问该线程时与线程无关仅创建一次。
先感谢您!
编辑:任何在Core Data并发问题上苦苦挣扎的人,本文都会列出一个非常好的设计模式,正如Aaron在下面的评论中指出的那样!
答案1
小编典典从Swift编程语言:属性:
如果
lazy
多个线程同时访问带有修饰符的属性,并且该属性尚未初始化,则不能保证该属性仅被初始化一次。
lazy var
不是线程安全的。您可以使用
dispatch_once
(在应用的整个生命周期内运行一次)- 常数(
let
) - 嵌套的struct模式(通常用于单例)
为了线程安全。
您还可以使用使用自己的锁定,NSRecursiveLock
但是效率可能不如dispatch_once
。
++运算符线程安全吗?
这个问题已经在这里有了答案 :
增量器/减量器(var ++,var–)等线程安全吗? (2个答案)
6年前关闭。
注意:我确实不是很擅长多线程编程,但是我当前的项目正在这样做,所以我试图弄清什么是线程安全的,什么不是线程安全的。
我正在阅读Eric Lippert 关于++
i所做的令人敬畏的答案之一。他说这是真正发生的事情:
- 计算x以产生变量
- 变量的值被复制到一个临时位置
- 临时值增加以产生新值(不覆盖临时值!)
- 新值存储在变量中
- 运算结果是新值
这让我开始思考,如果两个线程在哪里调用++
i怎么办?如果第一个线程在步骤3上时第二个线程在步骤2上。(这意味着如果第二个线程在第一个线程将新值存储在变量中之前将值复制到临时位置,该怎么办?)
如果发生这种情况,那么似乎两个线程只会增加i
一次,而不是两次。(除非整个事情都放在一个lock
。中)。
c# – RestSharp线程安全吗?
RestSharp似乎是显而易见的选择.然而,经过一番挖掘,我发现了this issue.
我无法在RestSharp谷歌组和GitHub上找到有关此问题的任何更新的证据.
在最后一次发布之前报告了这个问题,但我再也无法确定问题是否已得到修复.
有谁知道问题是否已修复?
解决方法
https://github.com/restsharp/RestSharp/issues/951
C# 静态构造函数线程安全吗?
换句话说,这个 Singleton 实现线程安全吗:
public class Singleton
{
private static Singleton instance;
private Singleton() { }
static Singleton()
{
instance = new Singleton();
}
public static Singleton Instance
{
get { return instance; }
}
}
C#数组线程安全吗?
特别是
- 创建一个函数以数组和索引作为参数。
- 创建一个元素数组。
- 创建一个计数循环。
- 在新线程的循环内部,使用传入的索引器将对象的新实例分配给数组。
我知道如何管理线程等。我有兴趣知道这是否是线程安全的方法。
class Program{ // bogus object class SomeObject { private int value1; private int value2; public SomeObject(int value1, int value2) { this.value1 = value1; this.value2 = value2; } } static void Main(string[] args) { var s = new SomeObject[10]; var threads = Environment.ProcessorCount - 1; var stp = new SmartThreadPool(1000, threads, threads); for (var i = 0; i < 10; i++) { stp.QueueWorkItem(CreateElement, s, i); } } static void CreateElement(SomeObject[] s, int index) { s[index] = new SomeObject(index, 2); }}
答案1
小编典典我相信,如果每个线程仅在数组的单独部分上工作,那么一切都会很好。如果您要 共享 数据(即在线程之间通信),则将需要某种内存屏障来避免内存模型问题。
我 相信
,如果您生成一堆线程,每个线程都填充其自己的数组部分,然后等待所有这些线程完成使用Thread.Join
,那么就屏障而言,这足以确保您的安全。目前,我没有任何支持文档,请注意…
编辑:您的示例代码是安全的。两个线程在任何时候都不会访问同一元素-
好像它们每个都有单独的变量一样。但是,这本身并不太有用。通常,在某个时候,线程将要共享状态-
一个线程将要读取另一线程已写的内容。否则,将它们写入共享数组而不是自己的私有变量是没有意义的。 那是 您需要小心的地方-线程之间的协调。
今天关于Swift-惰性var线程安全吗?的介绍到此结束,谢谢您的阅读,有关++运算符线程安全吗?、c# – RestSharp线程安全吗?、C# 静态构造函数线程安全吗?、C#数组线程安全吗?等更多相关知识的信息可以在本站进行查询。
本文标签: