簡體   English   中英

Windows Com 服務器是否連接了多線程?

[英]Is Windows Com Server with multiple clients connected multi threaded?

我有一個 com 服務器,它以下列方式啟動:

extern "C" int WINAPI _tWinMain(HINSTANCE hInstance, 
    HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int /*nShowCmd*/)
{
    lpCmdLine = GetCommandLine(); //this line necessary for _ATL_MIN_CRT

#if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)
    HRESULT hRes = CoInitializeEx(NULL, COINIT_MULTITHREADED);
#else
    HRESULT hRes = CoInitialize(NULL);
#endif
    _ASSERTE(SUCCEEDED(hRes));
    _Module.Init(ObjectMap, hInstance, &LIBID_EXACTACONSOLIDATIONLib);
    _Module.dwThreadID = GetCurrentThreadId();
    TCHAR szTokens[] = _T("-/");

    int nRet = 0;
    BOOL bRun = TRUE;
    LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
    while (lpszToken != NULL)
    {
        if (lstrcmpi(lpszToken, _T("UnregServer"))==0)
        {
            _Module.UpdateRegistryFromResource(IDR_ExactaConsolidation, FALSE);
            nRet = _Module.UnregisterServer(TRUE);
            bRun = FALSE;
            break;
        }

        if (lstrcmpi(lpszToken, _T("RegServer"))==0)
        {
            _Module.UpdateRegistryFromResource(IDR_ExactaConsolidation, TRUE);
            nRet = _Module.RegisterServer(TRUE);
            bRun = FALSE;
            break;
        }

        lpszToken = FindOneOf(lpszToken, szTokens);
    }
    if (bRun)
    {
        _Module.StartMonitor();

        #if _WIN32_WINNT >= 0x0400 & defined(_ATL_FREE_THREADED)

        hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
            REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED);
        _ASSERTE(SUCCEEDED(hRes));
        hRes = CoResumeClassObjects();

        #else

        hRes = _Module.RegisterClassObjects(CLSCTX_LOCAL_SERVER, 
            REGCLS_MULTIPLEUSE);

        #endif

        _ASSERTE(SUCCEEDED(hRes));

        MSG msg;
        while (GetMessage(&msg, 0, 0, 0))
            DispatchMessage(&msg);

        _Module.RevokeClassObjects();
        Sleep(dwPause); //wait for any threads to finish
    }
}

My question is if multiple clients are connected to this COM Server does it process the requests (function calls to the com object that the com server is hosting) in a synchronous fashion?

我問的原因是因為以下情況:客戶端 A客戶端 B都連接到Com 服務器 C 他們都發出一個請求,這個請求涉及使用 COM Object 從數據庫中檢索下一個項目(在我的例子中是訂單)。 不應允許兩個客戶端擁有相同的項目,因此基本上發生的情況是,當從數據庫中檢索並返回給客戶端時,每個項目都被標記為已使用。

如果有 2 個客戶端連接到同一個 COM 服務器,是否足以在上述場景中將數據庫中的項目標記為已使用而不用擔心競爭條件 如果請求是同步處理的,我認為只需將項目標記為已使用就可以了。

這取決於注冊(或者更確切地說,創建)class 對象的線程是單線程單元還是多線程單元。 請參閱有關線程模式的 MSDN 文章 如果您使用CoInitialize(NULL)CoInitializeEx(NULL, COINIT_APARTMENTTHREADED)初始化 COM ,那么您在 STA 中; 如果您使用CoInitializeEx(NULL, COINIT_MULTITHREADED)CoInitializeEx(NULL, 0) ,則您在 MTA 中。

如果您在 MTA 中,COM 將從線程池同時多次調用您的對象。 在 STA 中,一次只能進行一個呼叫。 如果您只是想避免比賽,使用 STA 可能是一種合理的方法; 但是請記住,這會造成性能瓶頸,因此對於容量非常大的服務器,或者請求可能需要一段時間的服務器,使用帶有您自己的同步邏輯的 MTA 可能更可取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM