以SLAM系统的前后端为例,有两个线程,分别是前端线程和后端线程,而这两个线程都会对全局变量路标点landmark
进行修改。前端线程中,我在frontEnd()
函数中计算路标点landmark
;后端线程中,我在backEnd()
函数中优化路标点landmark
。同时我希望“先由前端线程对变量landmark
进行修改,而后有后端线程对其进行优化”,然而由于这是两个线程,它们不会如我所希望的那样。因此,我们需要加入线程锁unique_lock<mutex>
,让它先执行完前端,再执行后端,使得线程之间对变量landmark
操作有了先后顺序。
不加线程锁的cpp代码如下,
#include <iostream>
#include <thread>
using namespace std;
int landmark = 0;
void frontEnd()
{
int n = 100;
while (n--)
cout << "前端正在计算路标点!" << endl;
cout << "-----------------前端路标点计算完毕,交由后端进行优化!-----------------" << endl;
}
void backEnd()
{
int n = 100;
while (n--)
cout << "后端正在对路标点进行优化!" << endl;
cout << "-----------------后端对路标点优化完毕!-----------------" << endl;
}
int main()
{
thread threadFront(&frontEnd);
thread threadEnd(&backEnd);
threadEnd.join();
threadFront.join();
return 0;
}
程序运行结果为,
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
-----------------前端路标点计算完毕,交由后端进行优化!-----------------
后端正在对路标点进行优化!
后端正在对路标点进行优化!
-----------------后端对路标点优化完毕!-----------------
由上述结果可知,前后端对变量landmark
的操作无先后顺序,这不是我们所期望的。
加入线程锁之后的cpp代码如下,
#include <iostream>
#include <thread>
#include <mutex>
using namespace std;
int landmark = 0;
mutex mymutex;
void frontEnd()
{
unique_lock<mutex> lock(mymutex);
int n = 100;
while (n--)
cout << "前端正在计算路标点!" << endl;
cout << "-----------------前端路标点计算完毕,交由后端进行优化!-----------------" << endl;
}
void backEnd()
{
unique_lock<mutex> lock(mymutex);
int n = 100;
while (n--)
cout << "后端正在对路标点进行优化!" << endl;
cout << "-----------------后端对路标点优化完毕!-----------------" << endl;
}
int main()
{
thread threadFront(&frontEnd);
thread threadEnd(&backEnd);
threadEnd.join();
threadFront.join();
return 0;
}
程序运行结果如下,
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
前端正在计算路标点!
-----------------前端路标点计算完毕,交由后端进行优化!-----------------
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
后端正在对路标点进行优化!
-----------------后端对路标点优化完毕!-----------------
由结果可知,前端对变量landmark
操作之后,再由后端对变量landmark
进行操作,这正是我们所期望的!
---------------------
作者:YMWM_
来源:CSDN
原文:https://blog.csdn.net/YMWM_/article/details/117514010
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件