原文:https://docs.unity3d.com/Manual/JobSystemSafetySystem.html
竞争条件
编写多线程代码时,总是存在竞争条件的风险。当一个操作的输出取决于其控制之外的另一个过程的时间的时候,就会发生竞争条件。
竞争条件并不总是一个Bug,但它是不确定行为的来源。当竞争条件确实导致Bug时,可能很难找到问题的根源,因为它取决于时间,因此您只能在极少数情况下重新复现问题。调试它可能会导致问题消失,因为断点和日志记录(Logging)可以改变单个线程的时间。竞争条件是编写多线程代码时最重大的挑战。
安全系统
为了更容易编写多线程代码,Unity C#作业系统可以检测所有潜在的竞争条件,并保护您免受可能导致的Bug的影响。
例如:如果C#Job System将主线程中代码中的数据引用发送到Job中,则无法验证主线程是否在作业写入数据的同时读取数据。这种情况就会创建竞争条件。
C#Job System通过向每个作业发送它需要操作的数据的拷贝副本来解决这个问题,而不是对主线程中的数据的引用。这种拷贝副本隔离数据,从而消除竞争条件。
C#Job System复制数据的方式意味着作业只能访问blittable数据类型。在托管代码和本机代码之间传递时,这些类型不需要转换。
C#Job System可以使用memcpy复制blittable类型,并在Unity的托管和本机部分之间传输数据。它在调度Job时用memcpy将数据放入本机内存,并在执行作业时为托管端提供对该拷贝副本的访问权限。有关更多信息,请参阅计划作业。