我在一个项目中使用 Pthread 和 Pthread_mutex。我有使用 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);
}
另一个执行这个[Display.cpp]
pthread_mutex_lock( &this->planeDB->mutex);
// Some stuff
pthread_mutex_unlock( &this->planeDB->mutex);
在这种情况下,指针“this”是两个不同的对象。指针 planeDB 和 planeDB 指向同一个对象。
我想创建一个互斥锁,它只允许一个函数在给定时间读取飞机数据库的内容。但是,在运行代码时,当 2 个线程尝试同时运行时出现错误。基本上,他们都试图锁定,我明白了:
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
初始化数据库正确修复了错误。