【发布时间】:2021-05-09 21:29:35
【问题描述】:
我有多线程 Qt 应用程序,我想启动它的几个实例。
- 我在 Mac OS X 10.15.4 上使用终端启动了我的应用程序的 3 个实例。 (./myapp/Contents/MacOS/myapp)
- 我所有的应用程序都挂在同一个互斥体上。
- 我为每个人创建了一个带有活动监视器的 spindump
- 我发现所有 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)
为什么会这样?我的互斥锁是否在应用之间共享?
【问题讨论】:
-
发生这种情况是因为您的程序中存在错误。 (每个进程都有一个虚拟内存空间,所以地址应该相同或相似。它们不是物理内存地址。)