Deadlock occurs in static variables with the Scoped function (Thread Unsafe in VC ++)

The question is, how is static level statistics built when a function is called in multiple threads?

Problem Description: Deadlock is concluded, and my application does not stop. During initialization of a local static variable, it tries to get MSVCR80! _lock and will never linger on the lock.

Team

! locks in WinDbg gives the following result.

CritSec ntdll! LdrpLoaderLock + 0 on 7c97e178
LockCount 0

RecursionCount 1

OwningThread 1998

EntryCount d

ContentionCount d

*** Blocked

CritSec MSVCR80! __ app_type + 94 at 781c3bc8

LockCount 1

RecursionCount 1

OwningThread 9a8

EntryCount 1

ContentionCount 1

*** Blocked

Below is the call stack and you will see that it never grabs the _mlock lock

#

**

17e8

**

781c3bc8 78132bd9 0777fde4 ntdll! RtlEnterCriticalSection + 0x46

00000008 b87d2630 00000000 MSVCR80! _lock + 0x2e

0864ae10 08631d7f 0864ae10 EPComUtilities32! _onexit + 0x36

0864ae10 b87d2588 00000001 EPComUtilities32! atexit + 0x9

0777fea8 0864719f 08630000 EPComUtilities32! XCriticalSectionEx:: ThreadTerminated + 0x5f

08630000 00000003 00000000 EPComUtilities32! DllMain + 0x20

08630000 7c90118a 08630000 EPComUtilities32! __ DllMainCRTStartup + 0x7a

08630000 00000003 00000000 EPComUtilities32! _DllMainCRTStartup + 0x1d #

**

1100

**

000000b0 00000000 00000000 ntdll! ZwWaitForSingleObject + 0xc

000000b0 ffffffff 00000000 kernel32! WaitForSingleObjectEx + 0xa8

000000b0 ffffffff 06ce64e0 kernel32! WaitForSingleObject + 0x12

000480ba 000f4240 00000000 CATSysMultiThreading! CATThreads:: Join + 0xf5

0012fcc8 00000004 00000000 JS0GROUP! CATLM:: StopHB + 0xf4

d138509f 00416694 00000001 JS0GROUP! CATLM:: Unmake + 0x6b

00000000 00000000 00000000 MSVCR80! _cinit + 0xd6

00000000 0012fd6c 081e68d9 MSVCR80! exit + 0xd

00000000 06d404f0 0998fb90 JS0GROUP! CATExit + 0x1d

00000000 004ef366 0000000d DNBPLMProvider! DNBEPLMTransactionMgt:: OnApplicationExit + 0x229

00000000 0012fd9c 004eabfc JS0GROUP! CATCallExits + 0x2bc

00000000 0012ff7c 0040cefd JS0GROUP! CATErrorNormalEnd + 0x31 00000000 06ce71d0 06ce71d0 JS0GROUP! CATExit + 0xc

00000007 06cdb120 059b61d8 DLMMfgContextSolver! main + 0x146d

ffffffff ffffffff bffde000 DLMMfgContextSolver! __ tmainCRTStartup + 0x10f

// Code snippet below 
void main() 
{

    atexit(MyCallBack); 
    exit(0); 

}

void MyCallBack() 
{

// Waitingforsingleobject() // Waits until all threads are terminated

}

EXE- DllMain DLL_THREAD_DETACH, ,

BOOL APIENTRY DllMain( HANDLE, DWORD dwReason, LPVOID ) 
{
  if(dwReason == DLL_THREAD_DETACH) 
  { 
    F1();
    F2();
  }
}

F1()
{

    const static CComBSTR bstrMethod = __ FUNCTION __ ;

}

F2()
{

    const static CComBSTR bstrMethod = __ FUNCTION __ ;

}

. , () , . - , ?

. , .

, .

+3
3

- : ( ) DllMain.

, DllMain. , Dll ( malloc ..), . , , , Kernel32.dll( / Dlls!) .

, , , CComBSTR .

, ,

p.s.

MSDN: http://blogs.msdn.com/oleglv/default.aspx

+1

C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\atonexit.c 103 , _EXIT_LOCK1 ( , , , )?

, Waitingforsingleobject - , , ?

0

, CComBSTR.

, ( ) NO concurrency. Bad Thing?

, . , , , , .

0

Source: https://habr.com/ru/post/1734514/


All Articles