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