我正在查看旧版代码。我看到有两个DLL共享公共代码库,因此Dlls共享一些公共方法和同步对象名称。这意味着它们都创建并使用同名的Critical Section同步对象。即使在Windows上的进程中,我也知道global/Static variables are not shared between two modules。从理论上讲,我们正在创建两个独立的同步对象,这些对象在各自的DLL中独立运行,因此这不是问题。

现在考虑这种情况-
如上所述,有一个Proc.exe进程会加载两个DLL A.dll和B.dll,这两个DLL都有一个通用的临界区对象名称g_cs和一些通用的方法名称,现在考虑一个通用的方法名称foo( )是线程安全的,如下所示:

foo()
{
  ....
  EnterCriticalSection(g_cs)
  ....
  ....
  LeaveCriticalSection(g_cs)
  ....
  ....
}


假设两个线程T1和T2正在Proc.exe中运行,并且当前处于foo()方法中。
有时我遇到僵局。从日志中,我看到t1和t2一个接一个地同时获取了critical_section g_cs,之后再也不会解锁“ g_cs”。我的理解是,仅当T1和T2分别在A.dll和B.dll的上下文中运行时,它们才能同时获取“ g_cs”。那样的话,这种执行应该是安全的吗?

我的理解是关键部分对象属于该进程,因此问题可能是由于两个dll中的同步对象的通用名称'g_cs'引起的。但是从理论上讲这不应该发生。

最佳答案

如前所述,使用相同的变量名不是问题。即使关键部分以某种方式被合并,也不会导致僵局。

您应该在出现死锁时附加调试器。线程堆栈可能已经指出了问题。如果确实存在僵局,请在调试器的监视中添加关键部分。会有一个显示所有者线程ID的字段。转到该线程(从“线程”窗口中选择它)并检查其堆栈。

关于c++ - 在同一过程中使用的两个模块中使用同步对象的通用名称是否安全?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18372474/

10-11 23:22
查看更多