看看我是不是在统一线程上

Posted

技术标签:

【中文标题】看看我是不是在统一线程上【英文标题】:Find out if I'm on the unity thread看看我是否在统一线程上 【发布时间】:2014-12-14 15:58:34 【问题描述】:

如何检查我所在的线程是否是 Unity 线程?

我尝试在构造函数时捕获 threadId,但在程序生命周期的某个地方,threadId 会移动。

在我的项目中,一些辅助线程进程需要访问新创建的对象。 我使用生产者-消费者模式,因此可以在 Unity 线程上创建它们。 对象工厂对请求进行排队,并在Update() 上,我请求的对象在正确的线程上实例化。在 Queued 和 Instantiated 之间,工厂方法等待带有 AutoResetEvent 的 ObjectCreated 事件。

现在有时会从主线程调用这个工厂,AutoResetEvent 会阻塞它自己的线程。 我还用

尝试了肮脏的方式
// First try on this thread
try

    return action();

catch (ArgumentException ex)

    Debug.Log("Tried on same thread, but failed. "+ex.Message);

PushToQueueAndWait(action);

但是当 unity 抛出异常时,无论是否捕获,程序都会停止。

如果我可以检查我是否在正确的线程上,我可以在排队和执行之间切换。

【问题讨论】:

我从来没有见过主线程ID变化,你是如何获得价值的? System.Threading.Thread.CurrentThread.ManagedThreadId 对我有用,并且在我的测试过程中不会改变。此外,在 Unity 编辑器的预览模式下运行线程代码可能会导致意外行为。 System.Threading.Thread.CurrentThread.ManagedThreadId 似乎从构造函数时的状态和运行中途的状态发生了变化。不知道任何细节。我在某处读到它可能与编辑器有关。试图不那么模糊,但还没有找到模式。 我怀疑 Unity 的主线程是否会改变。这表明它会冻结主事件循环,将该状态复制到新线程,然后重新开始循环。 Unity 不支持多线程,所以很难想象他们为什么要设计这样的东西。如果您开发了该问题的工作示例,将会很高兴。 answers.unity3d.com/questions/62631/… 【参考方案1】:

我通过捕获整个线程然后将其相等来解决它:

public void Start()
    mainThread = System.Threading.Thread.CurrentThread;


bool isMainThread()
    return mainThread.Equals(System.Threading.Thread.CurrentThread);

相关:http://answers.unity3d.com/questions/62631/i-wonder-about-thread-id-plz-answer-me.html

【讨论】:

请注意,Update() 始终在主线程上调用,因此检查您是否在 Update() 内的主线程上将始终返回 true。我将编辑答案以在可以从任何线程调用的函数中检查它。【参考方案2】:

我同意鲍里斯·卡伦斯的观点,但有一点, 检查时应使用mainThread.ManagedThreadId == System.Threading.Thread.CurrentThread.ManagedThreadIdEquals 默认为 Object 且无法正常工作。

【讨论】:

“工作不正常” mainThread.Equals(System.Threading.Thread.CurrentThread) 有什么问题?

以上是关于看看我是不是在统一线程上的主要内容,如果未能解决你的问题,请参考以下文章

用java 代码怎样删除一个压缩包??

这是一个 OK 测试,看看是不是设置了变量

Java技术指南「技术盲区」看看线程以及线程池的异常处理机制都有哪些?

Java技术专题「技术盲区」看实战出发看看线程以及线程池的异常处理机制都有哪些?

一起看看这些大厂面试真题查漏补缺吧,Java线程池中的线程复用是如何实现的

突然想看看线程池