【问题标题】:Are Win32 windows thread safe?Win32 windows线程安全吗?
【发布时间】:2011-09-20 17:26:06
【问题描述】:

我想在一个线程上创建一个窗口,然后将该 HWND 迁移到它将执行的任意数量的线程之一。我的程序将有多个这样的窗口。这是可能的还是 Win32 API 不是为此而设计的?

【问题讨论】:

  • 所以你想在一个线程上创建一些东西,然后在另一个线程上删除它,你认为这个想法没有问题?
  • @AJG:new/delete 没问题。完全有理由怀疑其他资源。
  • @MSalters:取决于实现,但没有提到堆分配。只是提出来以防被忽视。

标签: c++ windows winapi


【解决方案1】:

在一定程度上是的。

您可以从任何线程向 HWND 发送和发布消息。

http://msdn.microsoft.com/en-us/library/ms644944(v=VS.85).aspx

尝试从另一个线程配置 UI(例如添加控件)会以失败告终。但是,如果您向窗口发送消息,则可以确保该消息将在创建线程上得到处理。

【讨论】:

  • 这是最正确的答案——Win32实际上是跨线程访问最宽松的UI框架,win32k.sys试图让一切正常。但是,最好还是假装你不知道这一点,并像对象被线程关联一样操作
  • 是的。 “大多数情况下”不是我喜欢与我写的任何东西相关联的描述:)。似乎如果您对发送/发布消息(或它们的 21 世纪对应物)并不严格,有时就会发生奇怪的事情。
  • 这是更好的答案,因为发送消息是我感兴趣的。
【解决方案2】:

不,这是不可能的。窗口用于其消息循环的线程(您称为“执行”)是在创建窗口时定义的。您可以创建多个线程并从它们开始消息循环(从而在它们上创建窗口),但这通常被认为是危险的。

【讨论】:

  • 有人过来并在此页面上用向下箭头对所有内容投了反对票,我试图撤消它
  • 这里不是反对者,但我想知道:如何/为什么使用多个 GUI 线程“危险”?这可能是一种高级实践——在普通的 Hello World 或简单的对话应用程序中不需要这样做,但据我所知并不危险。这在许多复杂的应用程序(Explorer、IE,也可能是办公室)中很常见。
  • @BrendanMcK:“危险”在这里可能不是最好的词选择,但我的意思是你必须小心使用它。
  • @Adam;明白了——从某种意义上说,即使是常规的多线程,对于那些不熟悉该领域的人来说也充满了潜在的陷阱。无论如何,只是想澄清一下,拥有多个 GUI 线程是完全有效的,并且支持使用 Win32 API。
  • @BrendanMcK:是的;诚然,我来自与 .NET 开发人员打交道,在这些开发人员中,创建 GUI 应用程序和额外线程的便利性会导致人们在处理两者的组合时产生一种错误的安全感。
【解决方案3】:

must be called from the same thread 有两个重要的调用:CreateWindowGetMessage(或它们各自的等价物)。您的解决方案不会,所以它是错误的。

您可以在任何线程中调用PostMessageSendMessage 有点危险,因为它在跨线程场景中阻塞,并且可能死锁。

【讨论】:

  • 我今天遇到一种情况,工作线程上的一些代码从临界区调用 SendMessage 并死锁。浪费了一个小时看它,我认为将处理放在 UI 线程和 PostMessage 上我的指令更谨慎。
【解决方案4】:

不,这些调用没有并发检查。

【讨论】:

    猜你喜欢
    • 2010-10-16
    • 2010-09-13
    • 2012-06-30
    • 2020-04-15
    • 2011-07-04
    • 2014-04-26
    • 2012-11-30
    • 2010-12-30
    • 2013-03-12
    相关资源
    最近更新 更多