0

我在一个项目中使用 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

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

4

0 回答 0