STA: Single-Thread Apartment, 中文叫单线程套间。就是在COM库初始化的时候创建一个内存结构,然后让它和调用CoInitialize的线程相关联。这个内存结构针对每个线程都会有一个。支持STA的COM对象只能在创建它的线程里被使用,其它线程如果再创建它就会失败。
MTA: Mutil-Thread Apartment,中文叫多线程套间。COM库在进程中创建一个内存结构,这个内存结构在整个进程中只能有一个,然后让它和调用CoInitializeEx的线程相关联。支持MTA的COM对象可以在任意线程里被使用。多有针对它的调用都会被封装成为消息。
其实STA和MTA是COM规定的一套线程模型,用于保障多线程情况下你的组件代码的同步。比如说有一个COM对象它内部有一个静态变量 gHello,那么这个对象无论生成多少实例对于gHello在内存中只能有一份,那么如果有两个不同的实例在两个线程里面同时去读写它,就有可能出错,所以就要就要有种机制进行同步保护,STA或者MTA就是这种机制。
问:
如果这样说的话,那就是使用STA线程模式的程序应该是任何时候都是单线程运行的,那么为什么我的多线程程序还能正常运行呢?而且结果也是正确的。
回答:
你的程序到底是多线程还是单线程完全看你怎么写的,跟使用单线程还是多线程库没有任何关系。但是,在使用单线程库时,如果你在非主线程(你程序进入主函数的第一个线程是主线程)使用线程不安全的函数(如IO函数,内存函数),那么就有可能出现问题,当然这些问题你是否会碰到,这也要看具体情况。
如果使用多线程库,也要注意符合其使用规矩,例如在哪个线程获得的资源就在哪个线程使用,因为个别资源是线程敏感的。还有其他类似的问题。问题的碰到也要看你的代码决定。
你就是恰好没碰到那些问题,或没有用到线程不安全的东西。
“MTA单元可以同时运行多个线程,并使用所有可用的共享数据”
回答:
在多个线程进行操作时,这个库里面的函数考虑到多线程可能带来的问题(如IO同步等),进行特别设计,这个库尽量将多个线程可以共享的资源共享起来(在一定程度上IO等确实可以共享起来),但是你最好小心使用,因为你的脑子比当前任何计算机都聪明。
0 评论:
发表评论