版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/qit1314/article/details/85012076
缘起:
本人研究方向为移动机器人,在看cartographer和orbslam时发现,该程序都使用了c++11的多线程编程,由于并非计算机专业出身,故需学习相关知识。
《C++并发编程实战》正是将相关内容,故把学习笔记整理!
第一章 你好,并发世界
本章作者采用了what,why,how的形式,概述了什么是并发(1.1),为什么并发(1.2)和如何并发(1.3)
最后举了一个例子结尾。
1.1 什么是并发
简单的说,并发是指两个或更多独立的活动同时发生,如边听歌边写作业!
1.2 为什么并发
为了划分关注点和效率
1.3 如何并发
多线程并发和多进程并发,通常是多线程并发。
c++11支持并发编程,本书就将c++库的。
1.4 例子:
#include <iostream>
#include <thread> //多线程支持的头文件
void hello()
{
std::cout<<"Hello Concurrent World\n";
}
int main()
{
std::thread t(hello); //每个线程都必须具有一个初始化函数,新线程执行从这里开始
t.join(); //初始线程始于main,新线程始于hello,main等待hello执行完毕!
}
这里的join怎么理解呢?
由于上述程序,把一个线程,一分为2,于是就像树叉那样有了分支,两个分支独立的运行。
如果main函数先执行完毕,则程序结束,所以需要让main线程等待hello线程执行完毕,我们再去搞其他的事情。
当hello运行完毕,线程又只有一个main线程,相当于分支又join回来了!
编译程序
g++ -std=c++11 -o listing1_1 -Wl,--no-as-needed listing_1.1.cpp -lpthread
如果不用上述编译方法会出错
terminate called after throwing an instance of 'std::system_error'
what(): Enable multithreading to use std::thread: Operation not permitted
若是qtcreator,则在.pro中添加:
LIBS += -pthread
QMAKE_CXXFLAGS += -pthread
QMAKE_CXXFLAGS += -std=c++11
解决办法参考:
https://blog.csdn.net/libaineu2004/article/details/77196799
#include <iostream>
#include <thread> //多线程支持的头文件
void hello()
{
std::cout<<"Hello Concurrent World\n";
}
int main()
{
std::thread t(hello); //每个线程都必须具有一个初始化函数,新线程执行从这里开始
//t.join(); //初始线程始于main,新线程始于hello,main等待hello执行完毕!
}
看了第二章内容,还是得补充一下,这个程序。
如果注释了t.join();
则会报错:
terminate called without an active exception
已放弃 (核心已转储)
这是因为:
一旦开始了线程,你必须显示地决定是要join,还是detach。
如果在std::thread对象销毁之前未做决定,则会出现上述错误。