本篇内容介绍了“c++的mutex怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
面临的问题
多线程同时操作一段数据时,线程调度由操作系统控制,在机器码层次进行,所以访问同一数据的多个任务(线程)的代码随机交替执行,从而导致任务(线程)间数据交换不能正常进行。
解决问题的方式
问题搞清楚以后,对策当然就是保证每个线程内操作数据的处理的完整性。但是C/C++中达成这个目标的手段不是将数据保护起来,而是限制操作数据的代码的同时执行。具体说,就是在开始执行操作数据的代码之前先通过mutex::lock方法锁定互斥量,然后执行对数据进行操作的代码。数据操作代码执行完了之后,再通过mutex::unlock释放互斥量。在互斥量的锁定期间其他线程无法锁定信号量。
由于操作系统可以保证同一时刻只有一个线程可以锁定成功,所以只要程序在所有操作同一数据的代码之前都有锁定互斥量的动作,结果上就可以保证同一时刻只有一段操作数据的代码可以执行,而不被其他操作改数据的代码打断。这样就间接保证了数据的完整性。
注意事项
根据上面的描述,可以知道,使用Mutex进行数据交互必须遵循以下原则:
所有操作数据的代码在执行之前必须首先尝试锁定同一个互斥量
只有在互斥量锁定成功的情况下才允许执行操作数据的代码
操作数据的代码执行以后,必须释放互斥量
如果在操作数据之前没有锁定互斥量的过程,或者锁定的是不同的互斥量,无论哪一种情况都达成不了同一时刻,只有一段代码执行的目标。
如果操作数据的代码执行之后没有释放互斥量,后续处理数据的代码将永远不能锁定互斥量,也就是说,后续的数据处理不能继续执行。
请按照上述原则在审视一下代码,主要关注mutex:
QMutex mutex;
//define CreateDataTask class.
class CreateDataTask : public QThread
{
public:
CreateDataTask(QMutex& mutex)
:m_mutex(mutex)
{
}
private:
QMutex& m_mutex;
void run()
{
for(int i = 0; i < 10; ++i)
{
m_mutex.lock();
cout << "WT:<<<<WriteData:" << i
<< "<<<<" << endl;
WriteData();
m_mutex.unlock();
}
}
};
::timeBeginPeriod(1);
//Create thread object of CreateDataTask.
CreateDataTask *writer = new CreateDataTask(mutex);
//Start Thread.
writer->start(QThread::NormalPriority);
for(int i = 0; i < 10; ++i)
{
mutex.lock();
cout << "RT:>>>>ReadData:" << i
<< ">>>>" << endl;
ReadData();
data_array.clearData();
mutex.unlock();
}
timeEndPeriod(1);
应该讲点原则
有一种说法,飞机是试飞员飞出来的,估计也会有很多人说,程序是程序员Debug出来的。这种观点作者实在是不敢苟同。多任务编程就是一个不能靠调试解决问题的例子。必须遵循上面的原则,否则的话程序的动作会有很大的不确定性。在开发的最后阶段,多任务相关的问题都会占有相当大的比例。那简直就是程序员的噩梦。
“c++的mutex怎么用”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。