我创建了两个线程,并使用互斥来同步它们 在主窗口程序(我认为是主线程)中创建了另一个线程,我必须在至少两个函数中使用互斥,因为一个是一个接受来自UI的信号的插槽用户选择菜单并配置数据,还有一个计时器,每秒耗尽1次,并触发读取数据的插槽功能。
我的程序经常崩溃,即使我使用互斥锁。在“主线程”中有不同的函数,它们具有互斥锁和解锁操作,其中一个函数是链接到计时器的插槽。另外另一个线程连续写入数据。
我很困惑,为什么? (:)在此之前我真的需要一个更好的手机来编辑我的问题:))
我的代码:
在线程中:
class Background : public QThread
{
Q_OBJECT
public:
void Background::run(void)
{
initFile();
while(1)
{
Mutex->lock();
msleep(40);
rcv(); //writes map here
Mutex->unlock();
}
}
...
}
在thread的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();
}
答案 0 :(得分: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();
}