【问题标题】:Multiple instances of the same application hang when they launched with terminal on Mac同一应用程序的多个实例在 Mac 上使用终端启动时挂起
【发布时间】:2021-05-09 21:29:35
【问题描述】:

我有多线程 Qt 应用程序,我想启动它的几个实例。

  1. 我在 Mac OS X 10.15.4 上使用终端启动了我的应用程序的 3 个实例。 (./myapp/Contents/MacOS/myapp)
  2. 我所有的应用程序都挂在同一个互斥体上。
  3. 我为每个人创建了一个带有活动监视器的 spindump
  4. 我发现所有 spindump 都具有大致相同的内容(线程 ID、对象地址等),但进程 ID 除外。

我还可以看到,我的互斥锁在每个应用程序中为一个线程调用了一次。所有 spindump 都有相同的调用堆栈、地址、id:

Thread 0x3e6702    Thread name "working_thread"    1000 samples (1-1000)    priority 31 (base 31)
...
std::__1::recursive_mutex::lock() + 9 (libc++.1.dylib + 222839) [0x7fff6d45f677]
_pthread_mutex_firstfit_lock_slow + 222 (libsystem_pthread.dylib + 6455) [0x7fff7035d937]
__psynch_mutexwait + 10 (libsystem_kernel.dylib + 12386) [0x7fff702a1062]
psynch_mtxcontinue + 0 (pthread + 9566) [0xffffff7f82b2e55e] (suspended, blocked by turnstile waiting for myapp [51272] [unique pid 1045970] thread 0x3e881c)

为什么会这样?我的互斥锁是否在应用之间共享?

【问题讨论】:

  • 发生这种情况是因为您的程序中存在错误。 (每个进程都有一个虚拟内存空间,所以地址应该相同或相似。它们不是物理内存地址。)

标签: c++ macos qt


【解决方案1】:

没有。不同进程的内存空间是不相连的(大部分)。

有一种称为 ASLR(地址空间布局随机化)的技术可以降低地址的可预测性,因为如果地址是可预测的,则缓冲区溢出漏洞利用会更容易。除此之外,地址将非常相似。

现代操作系统'给每个进程一个独特的虚拟内存空间。有时它们共享一个内核内存空间。但是在运行相同步骤的两个程序上,堆栈分配的互斥体(甚至堆上的互斥体)的地址可能相同。

有些操作系统的不同进程共享相同的内存空间。它们往往是旧的,或者用于非常小的计算机,而不是在台式计算机上使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    相关资源
    最近更新 更多