使用互斥锁后程序仍然崩溃(我可以在同一个线程中使用互斥锁吗?)
Posted
技术标签:
【中文标题】使用互斥锁后程序仍然崩溃(我可以在同一个线程中使用互斥锁吗?)【英文标题】:Program still crashes after using mutex(can i use mutex in the same thread?) 【发布时间】:2012-10-17 08:51:37 【问题描述】:我创建了两个线程,并使用互斥锁来同步它们。 在创建另一个线程的主窗口程序(我认为是主线程)中,我必须在至少两个函数中使用互斥锁,因为一个是在用户选择一个菜单并配置数据,还有一个每秒运行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();
...
在线程的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();
【问题讨论】:
请花点时间好好写。你不会喜欢这样写的很仓促的答案,所以在提问时也要表现出同样的礼貌。 谢谢,我已经编辑好了。 【参考方案1】:您可以在任何线程中使用互斥锁。它是为此目的而设计的。但是您不应该创建死锁,例如,如果您对“锁”进行“嵌套”调用。
好:
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();
【讨论】:
原来的问题是:“我可以在同一个线程中使用互斥锁吗” 是的,我只是问:'这里有什么问题吗:in thread_1: fun_1()mutex->lock; ... mutex->unlock; , fun_2()mutex->lock; ...互斥锁->解锁;;在 thread_2 中:while(1)msleep(40);互斥->锁定;......;互斥->解锁;。'以上是关于使用互斥锁后程序仍然崩溃(我可以在同一个线程中使用互斥锁吗?)的主要内容,如果未能解决你的问题,请参考以下文章