0

我创建了两个线程,并使用互斥锁来同步它们。
在创建另一个线程的主窗口程序(我认为是主线程)中,我必须在至少两个函数中使用互斥锁,因为一个是当用户选择菜单并配置时从 UI 接收信号的插槽data,还有一个计时器,每秒运行 1 次,并触发一个读取数据的槽函数。

即使我使用 mutex ,我的程序也经常崩溃。在“主线程”中,有不同的函数具有互斥锁的锁定和解锁操作,其中一个函数是链接到计时器的插槽。另一个线程也不断地写入数据

我很困惑,为什么?
(:) 在此之前我真的需要一部更好的手机来编辑我的问题 :) )

我的代码:
在线程中:

class Background : public QThread
{
    Q_OBJECT

public:
    void Background::run(void)
    {
        initFile();

        while(1)
        {

            Mutex->lock();
            msleep(40);
            rcv();          //writes map here
            Mutex->unlock();

        }

    }
...
}

在线程的 rcv() 中:

void Background::rcv()
{
    DEVMAP::iterator dev_r;

    for(dev_r= DevMap.begin(); dev_r!= DevMap.end(); dev_r++)//DevMap is a refrence to the dev_map in mainwindow.
    {
       ...  ....//writes the map

    }
}

在主窗口中:

void MainWindow::initTimer()
{
    refreshTimer = new QTimer(this);
    connect(refreshTimer, SIGNAL(timeout()), this, SLOT(refreshLogDisplay()));
    refreshTimer->start(1000);
}

void MainWindow::refreshLogDisplay()
{

//MUTEX
    mutex->lock();

    ......//read the map

//MUTEX
    mutex->unlock();

}

在线程的构造中:

Background(DEVMap& map,...,QMutex* mutex):DevMap(map)...,Mutex(mutex){}

在创建线程的主窗口中:

void MainWindow::initThread()
{


    mutex = new QMutex;
    back = new Background(dev_map,..., mutex);
    back->start();

}

和:

void MainWindow::on_Create_triggered()//this function is a slot triggered by a menu item in the MainWindow UI
{

    ......//get information from a dialog 


//MUTEX

    mutex->lock();

    BitState* bitState = new BitState(string((const char *)dlg->getName().toLocal8Bit()),
                                        string((const char *)dlg->getNO().toLocal8Bit()),
                                      dlg->getRevPortNo().toInt(), dlg->getSndPortNo().toInt());


    dev_map.insert(DEVMAP::value_type (string((const char *)dlg->getPIN().toLocal8Bit()), *bitState)); 
     //writes map here



//MUTEX
     mutex->unlock();


}
4

1 回答 1

2

您可以在任何线程中使用互斥锁。它是为此目的而设计的。但是您不应该创建死锁,例如,如果您对“锁”进行“嵌套”调用。

好的:

mutex->lock();
//code
mutex->unlock();
//code
mutex->lock();
//code
mutex->unlock();

坏的:

mutex->lock();
//code
mutex->lock(); //dead lock
//code
mutex->unlock();
//code
mutex->unlock();

在函数中使用锁时要准确:

void foo()
{
mutex->lock();
//code
mutex->unlock();
}

mutex->lock();
foo(); //dead lock
mutex->unlock()

此外,您需要锁定尽可能少的代码。将 sleep() 放在锁内并不是一个好主意,因为其他线程会在它睡眠时等待。

不好:

while(1)
{
  Mutex->lock();
  msleep(40);
  rcv();
  Mutex->unlock();
}

更好的:

while(1)
{
  msleep(40);
  Mutex->lock();
  rcv();
  Mutex->unlock();
}
于 2012-10-17T11:39:24.007 回答