C++ Pthread_mutex_lock在从两个不同线程锁定时崩溃

C++ Pthread_mutex_lock在从两个不同线程锁定时崩溃,c++,pthreads,qnx,qnx-neutrino,C++,Pthreads,Qnx,Qnx Neutrino,我正在为一个项目使用Pthread和Pthread_互斥体。我有一些计时器,它们使用SIGEV_thread()定期创建线程。在我的代码中,我有一个计时器,每5秒触发一个线程,另一个计时器每15秒触发一个线程 其中一个线程执行此代码 [Radar.cpp] void Radar::executeRadar(){ std::cout << "***Executing radar***" << std::endl; pthread_mut

我正在为一个项目使用Pthread和Pthread_互斥体。我有一些计时器,它们使用SIGEV_thread()定期创建线程。在我的代码中,我有一个计时器,每5秒触发一个线程,另一个计时器每15秒触发一个线程

其中一个线程执行此代码 [Radar.cpp]

void Radar::executeRadar(){
    std::cout << "***Executing radar***" << std::endl;

    pthread_mutex_lock( &this->airplaneDB->mutex);

    this->scanAirZone(this->airplaneDB->getPlanes());

    pthread_mutex_unlock( &this->airplaneDB->mutex);
}
本例中的指针“this”是两个不同的对象。planeDB和airplaneDB指针指向同一对象

我想创建一个互斥体,只允许一个函数在给定时间读取airplaneDB的内容。但是,在运行代码时,当两个线程试图同时运行时,我得到一个错误。基本上,它们都试图锁定,我得到:

Process 655382 (FlightSimulator) terminated SIGSEGV code=1 fltno=11 ip=000000010002d41d(/usr/lib/ldqnx-64.so.2@pthread_mutex_lock+0x000000000000000d) mapaddr=000000000002d41d. ref=0000000000000000
在AirplaneDB中,互斥锁的初始化方式如下:

    pthread_mutexattr_t attr;
    pthread_mutexattr_init(&attr);
    pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED);
    pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);

    pthread_mutex_init(&this->mutex, &attr);
有什么想法吗

更新: 该问题是由其中一个类中的指针设置不正确引起的。因此,尝试在地址0处锁定互斥锁。这一行应该让我找到答案:

@pthread_mutex_lock+0x000000000000000d

初始化数据库正确地修复了错误。

愚蠢的问题,但由于没有mcve,我没有太多选择。您要求跨进程共享互斥锁。有什么特别的原因吗?如果是这样,互斥对象应该驻留在共享内存块中。对于该代码的情况,
planeDB
airplaneDB
必须引用所述相同的共享内存块。那么,进程共享互斥体只是一种把握吗?老实说,我更倾向于认为这四个指针中的一个(两个this、planeDB和airplaneDB)可能是无效的。这只是我试图找到解决方案的遗留问题。我发现一个很老的博客,OP也有类似的问题(包括共享内存)。其中一个解决方案包括这行代码PTHREAD_PROCESS_SHARED。我还认为这是不必要的,因为我的程序只在线程上运行。。。但我现在不知所措,无法找到解决方案,因此不妨尝试一下。如果故障出在互斥锁中(看起来是),那么唯一合乎逻辑的结论就是通过地址传递的互斥锁结构无效,这意味着可能性是
planeDB
和/或
airplaneDB
(无论是哪种代码路径)都是无效的。如果您只需要调试stdout/err指令,我会在每次进入之前转储这些地址。这可能会很有启发性。如果它们保持一致,则在同一对象中查找潜在的覆盖(即,该结构中静音之前的内容)还有一个潜在的漏洞。你的想法很好。显示地址表明其中一个db的传递不正确。因此在地址0处创建了一个指针。谢谢你,你的耐心确实帮助我找到了问题!祝你愉快!
@pthread_mutex_lock+0x000000000000000d