Threading Model = "Both" query
Hi,
I have a global pointer to an object whose threading model is "Both". This
contains a function called test() which would display the current threadid.
The code is soemthing like this.
#include "stdafx.h"
#import "Test.dll"
using namespace TestLib;
TestLib::ITestBothClassPtr spBoth = NULL;
DWORD WINAPI ThreadProc1(LPVOID lpParam);
DWORD WINAPI ThreadProc2(LPVOID lpParam);
int _tmain(int argc, _TCHAR* argv[])
{
//CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
CoInitializeEx(NULL,COINIT_MULTITHREADED);
DWORD dwThreadId = 0
HANDLE hThread = CreateThread(NULL,0,ThreadProc1,NULL,0,&dwThreadId);
WaitForSingleObject(hThread,INFINITE);
hThread = CreateThread(NULL,0,ThreadProc2,NULL,0,&dwThreadId);
WaitForSingleObject(hThread,INFINITE);
spBoth->Test();
spBoth = NULL;
CoUninitialize();
return 0;
}
DWORD WINAPI ThreadProc1(LPVOID lpParam)
{
CoInitializeEx(NULL,COINIT_APARTMENTTHREADED);
//CoInitializeEx(NULL,COINIT_MULTITHREADED);
spBoth.CreateInstance(__uuidof(TestLib::TestBothClass));
spBoth->Test();
CoUninitialize();
spBoth->Test();
return 1;
}
DWORD WINAPI ThreadProc2(LPVOID lpParam)
{
spBoth->Test();
return 1;
}
It does not matter what threading model we follow.
1. Here the second call to spBoth->Test() in ThreadProc1 works though I are
calling it after CoUninitialize(). Also ThreadProc2's spBoth->Test() works
properly. According to me both these calls should have failed. Can anyone
tell me why?
2. If I stop calling CoInitializeEx in the primary thread the second call to
spBoth->Test() in ThreadProc1 as well as spBoth->Test() in ThreadProc2
crashes. Is COM doing something special for primary thread of an
application?
3. In the main thread I commented off CoInitializeEx and CoUninitialize().
In the thread ThreadProc1 I commented off the call to CoUninitialize() and
in ThreadProc2 I added CoInitializeEx and CoUninitialize(). Here
spBoth->Test() crashes in ThreadProc2. My guess was that if its working in
scenario 1 it should have worked here also.
Can anyone please help me out in understanding what exactly is happening
here.
Thanks and Regards
Dinesh