我可以确定我写的代码总是在同一个线程中执行吗?

时间:2008-11-13 09:12:24

标签: windows multithreading com

我通常在单线程应用程序上工作,并且通常从不真正打扰处理线程。我对事物如何工作的理解 - 当然,可能是错误的 - 只要我们总是处理单线程代码(即没有叉子或类似的东西),它将始终在同一个线程中执行。

这个假设是否正确?我有一个模糊的想法,UI库/框架可能会产生自己的线程来处理GUI的东西(这说明Windows任务管理器告诉我我的'单线程'应用程序实际上在10个线程上运行)但我我猜这不会影响我吗?

这如何适用于COM?例如,如果我要在我的代码中创建COM组件的实例;并且COM组件将一些信息写入基于线程的位置(例如使用System.Threading.Thread.GetData)我的应用程序是否能够获取该信息?

总结如下:

  1. 在单线程代码中,我可以确定我在基于线程的位置存储的内容是否可以从代码中的任何其他位置检索?

  2. 如果单线程代码是创建COM组件的实例,该组件将某些信息存储在基于线程的位置,那么它是否可以从其他任何地方检索到?

2 个答案:

答案 0 :(得分:2)

UI通常具有相反的约束(遗憾的是):它是单线程的,一切都必须在该线程上发生。

检查你是否总是在同一个线程中(例如,一个函数)的最简单方法是将整数变量设置为-1,并且具有类似的检查函数(比如你在C#中):< / p>

void AssertSingleThread()
{
   if (m_ThreadId < 0) m_ThreadId = Thread.CurrentThread.ManagedThreadId;
   Debug.Assert(m_ThreadId == Thread.CurrentThread.ManagedThreadId);
}

那说:

我真的不明白问题#1。如果您的目的是拥有全局范围,为什么要存储在基于线程的位置?

关于第二个问题,大多数COM代码在单个线程上运行,并且通常在UI消息处理所在的线程上运行 - 这是因为大多数COM代码被设计为与单线程的VB6兼容。

你的程序有大约10个线程的原因是因为Windows(如果你使用它的一些功能,如完成端口或某种定时器)和CLR(例如用于GC或者某些类型的定时器) )可以在你的进程空间中创建线程(技术上任何具有足够权限的程序也可以)。

答案 1 :(得分:0)

考虑让你的mainThread中运行一个dataStore类的模型,所有线程都可以读取和写入它们的实例变量。这将避免在整个商店访问线程时可能出现的许多问题。

简单的想法,直到你达到线程的有趣部分。并发和同步;简单地说,如果你有两个线程想要同时读取和写入dataStore中的同一个变量,你就会遇到问题。

Java通过允许您声明变量或方法同步来处理此问题,一次只允许一个线程访问。

我相信一些.NET对象上定义了锁定和同步方法,但我知道的不多于此。