{
  "schemaVersion": "0.11.0",
  "canonical": "https://www.pystone.net/notes/uwa-answer-unity-job-system-issue/",
  "atlas": "https://www.pystone.net/?node=uwa-answer-unity-job-system-issue#knowledge-atlas",
  "markdown": "https://www.pystone.net/notes/uwa-answer-unity-job-system-issue.md",
  "context": "https://www.pystone.net/notes/uwa-answer-unity-job-system-issue.context.json",
  "knowledgeVersion": "224c990773de.5fa8af6e39fa",
  "build": {
    "siteCommit": "224c990773de166d23a886306577dd90379529ce",
    "notesCommit": "5fa8af6e39fa3891d1b9b4832bfa6c4e0ecaaf0a",
    "builtAt": "1970-01-01T00:00:00.000Z",
    "version": "224c990773de.5fa8af6e39fa"
  },
  "id": "note:uwa-answer-unity-job-system-issue",
  "slug": "uwa-answer-unity-job-system-issue",
  "title": "Unity Jobsystem问题",
  "type": "note",
  "visibility": "public",
  "idStability": "rename-stable",
  "author": {
    "name": "石心.Yong"
  },
  "publisher": {
    "name": "Perrin Yong",
    "profile": "https://www.pystone.net/profile/"
  },
  "aliases": [],
  "summary": "Unity Jobsystem问题",
  "contentRole": "source",
  "sourceType": "source",
  "sourceMetadata": {
    "author": "石心.Yong"
  },
  "isMoc": false,
  "mocRecognition": "none",
  "generated": false,
  "attribution": "external_source",
  "domain": "10-计算机、信息技术与工程",
  "tags": [],
  "mocs": [],
  "contentHash": "51f11ea21ae37816b6370ceff77f00523ca4d2a80384687f466149933c32106d",
  "assets": [
    {
      "reference": "assets/60471bd3cfa35d5b536699e8/01.png",
      "url": "/media/34bd632fd9984a66727b.png",
      "mediaType": "image/png",
      "contentHash": "34bd632fd9984a66727b6ebaf02b72bc8afea26b51073ca3a28ca776f972c509",
      "byteLength": 18563,
      "width": 715,
      "height": 547
    },
    {
      "reference": "assets/60471bd3cfa35d5b536699e8/02.png",
      "url": "/media/c04f2a57817b2a4bc354.png",
      "mediaType": "image/png",
      "contentHash": "c04f2a57817b2a4bc354558f619f3f6db42c47fbfb4a6da020bb22beaf6b26fe",
      "byteLength": 2803,
      "width": 448,
      "height": 36
    },
    {
      "reference": "assets/60471bd3cfa35d5b536699e8/03.png",
      "url": "/media/cde75dfd8dd35816d13b.png",
      "mediaType": "image/png",
      "contentHash": "cde75dfd8dd35816d13bae8ffe2561a65ce1e76dc99617f33ef7ca8e58f44bfb",
      "byteLength": 8267,
      "width": 309,
      "height": 147
    }
  ],
  "headings": [
    {
      "depth": 1,
      "text": "Unity Jobsystem问题",
      "anchor": "unity-jobsystem问题",
      "citation": "https://www.pystone.net/notes/uwa-answer-unity-job-system-issue/#unity-jobsystem%E9%97%AE%E9%A2%98"
    },
    {
      "depth": 2,
      "text": "问题",
      "anchor": "问题",
      "citation": "https://www.pystone.net/notes/uwa-answer-unity-job-system-issue/#%E9%97%AE%E9%A2%98"
    },
    {
      "depth": 2,
      "text": "我的回答",
      "anchor": "我的回答",
      "citation": "https://www.pystone.net/notes/uwa-answer-unity-job-system-issue/#%E6%88%91%E7%9A%84%E5%9B%9E%E7%AD%94"
    },
    {
      "depth": 2,
      "text": "来源与关系",
      "anchor": "来源与关系",
      "citation": "https://www.pystone.net/notes/uwa-answer-unity-job-system-issue/#%E6%9D%A5%E6%BA%90%E4%B8%8E%E5%85%B3%E7%B3%BB"
    }
  ],
  "claims": [],
  "outgoing": [
    {
      "id": "note:my-uwa-answers",
      "title": "我的 UWA 问答",
      "url": "https://www.pystone.net/notes/my-uwa-answers/",
      "atlas": "https://www.pystone.net/?node=my-uwa-answers#knowledge-atlas",
      "label": "我的 UWA 问答",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "上位集合：我的 UWA 问答",
      "citation": "https://www.pystone.net/notes/uwa-answer-unity-job-system-issue/#%E6%9D%A5%E6%BA%90%E4%B8%8E%E5%85%B3%E7%B3%BB"
    }
  ],
  "incoming": [
    {
      "id": "note:my-uwa-answers",
      "title": "我的 UWA 问答",
      "url": "https://www.pystone.net/notes/my-uwa-answers/",
      "atlas": "https://www.pystone.net/?node=my-uwa-answers#knowledge-atlas",
      "label": "我的 UWA 问答",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "2021-03-10：Unity Jobsystem问题（C#编程）",
      "citation": "https://www.pystone.net/notes/my-uwa-answers/#2021"
    },
    {
      "id": "note:game-graphics-and-runtime",
      "title": "游戏图形与运行时",
      "url": "https://www.pystone.net/notes/game-graphics-and-runtime/",
      "atlas": "https://www.pystone.net/?node=game-graphics-and-runtime#knowledge-atlas",
      "label": "游戏图形与运行时",
      "origin": "explicit",
      "humanReviewed": true,
      "context": "我的UWA问答中的“2021-03-10 - Unity Jobsystem问题”导航项",
      "citation": "https://www.pystone.net/notes/game-graphics-and-runtime/#%E6%88%91%E7%9A%84uwa%E9%97%AE%E7%AD%94"
    }
  ],
  "contentMarkdown": "# Unity Jobsystem问题\n\n> [!note] 我的 UWA 问答\n> 本文收录我在 UWA 问答发表的公开回答。问题内容归原提问者；回答保留当时语境，技术结论可能受 Unity 版本、平台和项目条件限制。\n\n## 问题\n\n```\nusing CSharp;\n\nusing Unity.Burst;\n\nusing Unity.Collections.LowLevel.Unsafe;\n\nusing UnityEngine;\n\nusing UnityEngine.Jobs;\n\nusing Unity.Collections;\n\nusing Unity.Jobs;\n\npublic class JobTest : MonoBehaviour\n\n{\n\n    // Start is called before the first frame update\n\n    public Transform t1;\n\n    public Transform t2;\n\n    public TransformAccessArray TransformAccessArray;\n\n    void Start()\n\n    {\n\n        TransformAccessArray = new TransformAccessArray(50000,64);\n\n    }\n\n    private JobHandle handle;\n\n    // Update is called once per frame\n\n    void Update()\n\n    {\n\n        if (!handle.IsCompleted)\n\n        {\n\n            return;\n\n        }\n\n        if (TransformAccessArray.length == 0)\n\n        {\n\n            TransformAccessArray.Add(t1);\n\n            TransformAccessArray.Add(t2);\n\n        }\n\n        float t = Time.time;\n\n        Debug.Log(\"time:\" + t);\n\n        NativeList<int> end_list = new NativeList<int>(TransformAccessArray.length,Allocator.TempJob);\n\n        NativeList<int> end_id_list = new NativeList<int>(TransformAccessArray.length,Allocator.TempJob);\n\n        UpdateJob job = new UpdateJob\n\n        {\n\n            time = t,\n\n            end_list = end_list,\n\n            end_id_list = end_id_list,\n\n        };\n\n        handle = job.Schedule(TransformAccessArray);\n\n        handle.Complete();\n\n        if (end_id_list.Length != end_list.Length)\n\n        {\n\n            Debug.LogError(\"error time:\" + t);\n\n        }\n\n        else\n\n        {\n\n            Debug.LogWarning(\"right time:\" + t);\n\n        }\n\n        end_list.Dispose();\n\n        end_id_list.Dispose();\n\n    }\n\n}\n\nusing System;\n\nusing Unity.Burst;\n\nusing Unity.Collections;\n\nusing Unity.Collections.LowLevel.Unsafe;\n\nusing UnityEngine;\n\nusing UnityEngine.Jobs;\n\nnamespace CSharp\n\n{\n\n    [BurstCompile]\n\n    public struct UpdateJob : IJobParallelForTransform\n\n    {\n\n        [NativeDisableContainerSafetyRestriction] public NativeList<int> end_list;\n\n        [NativeDisableContainerSafetyRestriction] public NativeList<int> end_id_list;\n\n        [ReadOnly] public float time;\n\n        public void Execute(int index, TransformAccess transform)\n\n        {\n\n            end_list.Add(index);\n\n            end_id_list.Add(index);\n\n            int a = end_list.Length;\n\n            int b = end_id_list.Length;\n\n        }\n\n    }\n\n}\n```\n\n执行多线程之后发现，end*id*list.Length和 end_list.Length的长度有时候不一样，谁能解答一下\n\n- 提问者：hardy\n- 提问时间：2021-03-09 22:55:15\n\n## 我的回答\n\n这样写的话，两个线程是并行的，并且是线程不安全的：\n\n![image.png](assets/60471bd3cfa35d5b536699e8/01.png)\n\n两个线程对指令的执行的先后顺序是不确定的。\n\n如果两个线程依次对end*list进行Add的话，end*list就会加入两个元素。\n\n如果两个线程同时取得end_list，同时进行Add，就会产生错误——两个线程都执行完后，某个List只添加了一个元素。\n\n可以用如下方法进行验证：\n\n![image.png](assets/60471bd3cfa35d5b536699e8/02.png)\n\n![image.png](assets/60471bd3cfa35d5b536699e8/03.png)\n\n如果对数据的访问进行加锁，保证一个线程访问list时，另外一个线程无法访问，就不会出现题主所述的问题。**不过这多线程执行就没有意义了，相当于顺序执行。**\n\n- 回答时间：2021-03-10 02:06:15\n- 最后更新：2021-03-10 02:07:28\n- 采纳状态：未采纳\n\n## 来源与关系\n\n- 上位集合：[[10-计算机、信息技术与工程/05-游戏图形与运行时/我的UWA问答/我的UWA问答|我的 UWA 问答]]\n- UWA 标签：C#编程\n- 原始问题：[Unity Jobsystem问题](https://answer.uwa4d.com/question/60471bd3cfa35d5b536699e8)\n- 源页最后更新：2021-03-10 02:06:15\n"
}
