关键词:C语言 C++ boost 多线程 异步 消息中间件 VS2022
引子
作为C语言的开发者,我会使用POSIX作为使用多线程的工具。其补充标准中提供了丰富的接口,足以应付常见的应用场景。在现在的机器上,我使用C++11进行开发, 当然C++11提供了线程接口,但是还不够,我需要一些消息中间件,来实现异步操作。当然我也自己写了消息中间件,他也正常工作了,我不推崇造重复造轮子。更何况自己造的轮子不一定更好用。今天这篇文章,是记录在windows与Linux平台下boost库中多线程工具的使用。
官网链接:Boost C++ Libraries
开发环境:VS 2019 minGW编译器传送门
正文
一共需要4个步骤完成配置,步骤5为测试代码。
下载
首先。下载boost。对于boost中的组件,很多是不需要编译就可以使用的,它只有头文件。这意味着你下载好,包含就可以使用了。但是多线程这个组件除外。他是需要编译的组件之一。那么我们开始下载吧。
下载地址:Boost Downloads
构建
通常官网会提供非常详细的教程的,更多说明,可以去官网获取,链接在文末。
如果仅使用无需构建的组件,那我们直接跳转到配置过程就好了。那么需要构建的组件都有哪些呢?
……
Boost.Thread
……
赫然在列。那么,第二步就是解压缩后,使用脚本构建工程。在windows下我们使用的是.bat批处理文件实现。在Linux下则是命令行。位于根路径下的bootstrap,执行该文件即可。
编译
然后,使用目标编译器进行编译出静态库或者动态库。执行完bootstrap会出现b2.exe点击执行即可。在stage\lib目录下发现生成libboost_thread-vc142-mt-gd-x32-1_80.lib,那么大功告成了。
配置
配置头文件
配置链接静态库
测试
包含头文件。
#include <iostream>
#include <boost/thread/thread.hpp>
测试代码。
void task()
{
std::cout << "Hello World!\n";
}
int main()
{
auto myThread = boost::thread(task);
myThread.join();
}
运行代码。
Hello World!
好了,万事大吉,玩点高级的吧。
拓展
线程间通信:无锁队列
包含头文件
#include <boost/lockfree/queue.hpp>
创建队列
boost::lockfree::queue<int> queue(128);
生产者
void producer(void)
{
for (int i = 0; i != iterations; ++i) {
int value = ++producer_count;
while (!queue.bounded_push(value));
sleep(1);
}
sleep(7);
clear_queue();
}
消费者
void consumer(void)
{
int value;
sleep(10);
while (queue.pop(value)) {
++consumer_count;
sleep(1);
}
}
来了!
int main(int argc, char* argv[])
{
using namespace std;
cout << "boost::lockfree::queue is ";
if (!queue.is_lock_free())
cout << "not ";
cout << "lockfree" << endl;
boost::thread th1(producer);
boost::thread th2(consumer);
th1.detach();
th2.detach();
while(1);
return 0;
}
完美!
补充
它太大了!
是的,它太大了,你需要指定模块编译就行,它太难了,你来吧,我喜欢傻瓜式的安装教程,新手友好。我的电脑也足够优秀,我懒得摆弄它了。
偶然发现了log组件,足够了,准备放弃log4cplus了!下一篇日志记录一下。
结尾
C++标准库中的用法可以参考我的另一篇学习笔记。是对第二版C++并发实践的关键概念和代码的摘录。这本书还在继续阅读,后续的笔记也会逐渐更新。C++并发简明教程https://blog.csdn.net/qq_18826027/article/details/127158380 生产消费者是啥?请移步这篇文章。