Boost安装和创建线程的使用
Boost
一 Boost库的基本介绍
Boost是一个流行的C++库集合,它包含了大量的用于C++程序开发的工具和组件,能够使C++程序员更快地开发高质量的代码。Boost库的目标是在不增加复杂性的情况下,提供对C++语言现有功能的增强,并且对标准C++库进行补充。
Boost库中的组件包括但不限于:智能指针、容器、多线程、正则表达式、数值算法、文件系统操作、日期和时间处理等。这些组件都被广泛应用于诸如高性能计算、网络编程、图像处理和数据分析等多个领域中。
Boost库本身遵循开源软件协议,可以在www.boost.org上找到最新版本。已经成为C++社区中最为流行和重要的库之一,被许多大型C++项目所使用。
二 Windows下安装Boost库
在Windows下,下载和安装Boost库可以通过以下步骤完成:
-
前往Boost库的官方网站https://www.boost.org/ ,在页面中找到"Download"按钮,点击进入下载页面。(我直接下载最新的版本为1.82.0);
链接: boost download -
在下载页面中,选择您要下载的Boost版本(建议选择最新版本),选择支持您的编译器版本并选择要下载的boost库包类型。例如,如果您使用的是Visual Studio 2019,则应该选择"Windows"平台, “MSVC版本”, “x64(64位)Windows”、“ZIP格式(7z格式)”。
-
下载完成后,解压缩压缩包。将解压缩文件夹放在合适的路径下以方便访问,例如"C:\boost_1_82_0"。(这个路径不唯一,看你个人喜好,安排在哪里)
-
编译库生成lib(静态库);
- 第一步:打开cmd(命令行窗口),然后跳转到boost库目录下 。
- 第二步:执行 bootstrap.bat 批处理(耐心等待批处理执行结束。)。执行结束后,会在当前目录下生成 b2.exe 文件。然后双击执行该可执行文件,并等待其执行结束。执行完生成的库(其中mt表示多线程,sgd中的s表示runtime 是static,gd表示debug版本)。在调用静态库时,根据自己的编译环境选择。
- 静态库以 lib 开头,动态库开头没有 lib。
- 所有的库都含有 boost 前缀。
- Boost 库名称。
- MSVC-14.2:对应Visual Studio 2019,编译器版本号为19.2。
- 有 mt 代表 threading=multi,没有则代表 threading=single。
- 有 s 代表 runtime-link=static,没有则代表 runtime-link=shared。
- 有 gd 代表 debug 版本,没有则代表 release 版本。
- 目标位数,x32 代表 32 位,x64 代表 64 位。
- Boost 库的版本号,1_82 代表 Boost 1.82 版本。
-
打开Visual Studio或其他支持boost库的编译器,打开工程,选择要使用boost库的工程文件,在"项目属性"窗口中,选择"C/C++" -> “常规” -> “附加包含目录”,加入boost库的头文件目录,例如"C:\boost_1_82_0"(根据自己安装的路径来) 。
-
在同一属性窗口下,选择"链接器" -> “常规” -> “附加库目录”,加入boost库文件的目录,例如"C:\boost_1_82_0\stage\lib"(根据自己安装的路径来)。
-
在同一属性窗口下,选择"链接器" -> “输入” -> “附加依赖项”,加入你需要使用的boost库。
-
点击确定保存设置,重新构建项目即可使用boost库。
测试demo
#include <iostream>
#include <boost/version.hpp>
#include <boost/config.hpp>
using namespace std;
int main(){
cout<<BOOST_VERSION<<endl;
cout<<BOOST_LIB_VERSION<<endl;
cout<<BOOST_PLATFORM<<endl;
cout<<BOOST_COMPILER<<endl;
cout<<BOOST_STDLIB<<endl;
getchar();
return 0;
}
结果显示 对应版本等信息;
三 Linux(Ubuntu20.04)下安装Boost库
方法一:
在Ubuntu 20.04下安装Boost库,可以按照以下步骤:
- 打开终端,输入以下命令安装Boost库:
sudo apt-get update
sudo apt-get install libboost-all-dev
- 等待安装完毕后,就可以使用Boost库了。
如果您只需要使用其中的部分库,而非全部库,您可以使用以下命令安装部分库:
- 输入以下命令来列出所有可安装的Boost库:
sudo apt-cache search libboost
- 选择需要安装的库,并使用以下命令安装:
sudo apt-get install libboost-"库名"-dev
例如,如果只需要安装Boost中的date_time库,可以使用以下命令:
sudo apt-get install libboost-date-time-dev
安装完毕后,您就可以在程序中使用Boost库了,只需在Makefile或编译命令中添加"-lboost_库名"以链接对应的库。例如,如果需要使用Boost中的DateTime库,就需要在编译选项中添加"-lboost_date_time"。
方法二:
-
1.前往Boost库的官方网站https://www.boost.org/ ,在页面中找到"Download"按钮,点击进入下载页面。(我直接下载最新的版本为1.82.0
链接: boost download -
2.下载压缩包后拷贝到Linux虚拟机里,解压出如下文件,路径不限;
-
3.运行脚本文件生成编译安装程序 “b2”
sudo ./bootstrap.sh
-
4.运行编译安装程序 “b2” 并指定安装路径(此过程可能会很慢)
sudo ./b2 install --prefix=/usr/local/boost_1_82_0
-
5.编译安装完成后,上一步指定的安装路径 ( /usr/local/boost_1_82_0 ) 下会生成 “include” 、“lib” 两个文件夹
: 头文件(.h/.hpp)
: 静态库文件(libxxx.a)和动态库文件(libxxx.so)
-
6.最后,可以把这三个目录加到系统对应的环境变量里:
对所有用户有效修改 “/etc/profile” 可能需要重启系统才会生效对个人有效则修改 “~/.bashrc”
gcc 编译器找到头文件(xxx.h)的路径,写C++程序一般都不会用到gcc,所以这个可以忽略不写
export C_INCLUDE_PATH=$C_INCLUDE_PATH:/usr/local/boost_1_82_0/include
g++ 编译器找到头文件(xxx.h/hpp)的路径
export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/usr/local/boost_1_82_0/include
找到静态库(xxx.a)的路径
export LIBRARY_PATH=$LIBRARY_PATH:/usr/local/boost_1_82_0/lib
找到动态链接库(xxx.so)的路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/boost_1_82_0/lib
测试demo
#include <iostream>
#include <boost/version.hpp>
#include <boost/config.hpp>
using namespace std;
int main(){
cout<<BOOST_VERSION<<endl;
cout<<BOOST_LIB_VERSION<<endl;
cout<<BOOST_PLATFORM<<endl;
cout<<BOOST_COMPILER<<endl;
cout<<BOOST_STDLIB<<endl;
getchar();
return 0;
}
编译
g++ boost.cpp -o boost -lboost_system
结果
108200
1_82
linux
GNU C++ version 9.4.0
GNU libstdc++ version 20210601
四 boost创建线程
Boost库提供了boost::thread类来创建和管理线程。以下是使用Boost库创建线程的示例:
#include <iostream>
#include <boost/thread.hpp>
using namespace std;
void threadFunc() {
cout << "Hello, world!" << endl;
}
int main() {
boost::thread t(threadFunc); // 创建一个线程,并绑定函数 threadFunc()
t.join(); // 等待线程结束
return 0;
}
在上述示例代码中,我们通过boost::thread来创建一个线程,将其绑定到函数threadFunc()上,然后使用join()方法等待线程结束。
需要注意的是,当我们使用Boost库创建线程时,需要链接pthread库,可以在编译指令中添加-l选项来链接该库。例如,在Linux上可以使用以下编译指令:
g++ -o myprogram myprogram.cpp -lboost_thread -pthread
在Windows上,需要将编译器的运行时库由默认的Multi-threaded改为Multi-threaded DLL,否则会编译出现链接错误。
#define BOOST_THREAD_VERSION 4
#include <iostream>
#include <boost/thread/thread.hpp>
using namespace std;
void threadFunc() {
cout << "Hello, world!" << endl;
}
int main() {
boost::thread t(threadFunc);
t.join();
return 0;
}
1 全局函数创建线程
boost库提供了boost::process::child类来创建新进程,具体方法如下:
#include <iostream>
#include <boost/process.hpp>
using namespace std;
namespace bp = boost::process;
void subProcess() {
cout << "sub process" << endl;
}
int main() {
vector<string> args; // 子进程命令行参数
args.push_back("myprogram");
bp::child c(bp::exe = "./myprogram", bp::args = args); // 创建子进程
c.wait(); // 等待子进程结束
subProcess(); // 在主进程中继续执行一些操作
return 0;
}
在上述示例代码中,我们使用bp::child类来创建一个新的子进程,将其执行文件设置为"./myprogram",并指定命令行参数为args,然后使用c.wait()等待子进程结束。待子进程结束后,控制会返回到主进程中,继续执行subProcess()函数中的操作。
需要注意的是,使用Boost库创建新进程时,需要链接Boost.Process库,可以在编译指令中添加-l选项来链接该库。例如,在Linux上可以使用以下编译指令:
g++ -o myprogram myprogram.cpp -lboost_process
2 类内函数创建线程
#include <iostream>
#include <boost/thread.hpp>
using namespace std;
class MyClass {
public:
void threadFunc() {
cout << "Hello, world!" << endl;
}
void startThread() {
boost::thread t(&MyClass::threadFunc, this); // 创建线程,并绑定对象及成员函数
t.join();
}
};
int main() {
MyClass obj;
obj.startThread();
return 0;
}
3 类外使用类内创建线程
使用Boost库进行类外使用类内函数创建线程的方法,需要创建一个Wrapper类,并使用boost::bind来绑定对象及成员函数。
以下是使用Boost库在类外使用类内函数创建线程示例代码:
#include <iostream>
#include <boost/thread.hpp>
#include <boost/bind.hpp>
using namespace std;
class MyClass {
public:
void threadFunc() {
cout << "Hello, world!" << endl;
}
};
class Wrapper {
public:
Wrapper(MyClass* obj) : m_obj(obj) {}
void startThread() {
boost::thread t(boost::bind(&MyClass::threadFunc, m_obj)); // 使用boost::bind来绑定对象及成员函数,创建线程
t.join();
}
private:
MyClass* m_obj;
};
int main() {
MyClass obj;
Wrapper wrap(&obj);
wrap.startThread();
return 0;
}