C++并发编程实战(一)

版权声明:本文为博主原创文章,未经博主允许不得转载 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对象销毁之前未做决定,则会出现上述错误。

猜你喜欢

转载自blog.csdn.net/qit1314/article/details/85012076