头文件:fiber_executor.h
#ifndef __FIBER_EXECUTOR_H__
#define __FIBER_EXECUTOR_H__
#include <atomic>
#include <memory>
#include <thread>
#include <boost/fiber/all.hpp>
* Brief: 协程程序, 执行具体的代码逻辑
class FiberProc
friend class FiberExecutor;
public:
* Brief: 构造函数
* Param: func - 协程程序函数, 若设置且没有重写run, 则会执行该函数, 若重写了run, 则会执行重写的run里面的具体代码逻辑
* stackSize - 协程的栈空间大小
* Return: None
FiberProc(const std::function<void()>& func = nullptr, std::size_t stackSize = (512 * 1024));
virtual ~FiberProc(void);
* Brief: 运行, 子类可以重写该接口来编写执行的代码逻辑
* Param: void
* Return: void
virtual void run(void);
* Brief: 取消
* Param: void
* Return: void
void cancel(void);
* Brief: 是否已取消
* Param: void
* Return: true - 已取消, false - 未取消
bool isCancelled(void);
private:
FiberProc(const FiberProc&) = default;
FiberProc& operator=(const FiberProc&) = default;
private:
std::function<void()> m_func;
std::size_t m_stackSize;
std::atomic_bool m_cancelled;
* Brief: 协程执行者, 内部会创建一个线程用于运行协程程序
class FiberExecutor final
public:
* Brief: 构造函数
* Param: channelCapacity - 协程队列容量
* Return: None
FiberExecutor(std::size_t channelCapacity = 1024);
virtual ~FiberExecutor(void);
* Brief: 等待退出(调用该接口会阻塞直到线程中的所有协程都执行完毕才会继续后续流程)
* Param: void
* Return: void
void join(void);
* Brief: 把协程程序对象加入当前队列
* Param: procObj - 协程程序对象
* Return: 协程程序对象(和入参一样)
std::shared_ptr<FiberProc> post(const std::shared_ptr<FiberProc>& procObj);
* Brief: 把协程程序函数加入当前队列
* Param: procFunc - 协程程序函数
* Return: 协程程序对象
std::shared_ptr<FiberProc> post(const std::function<void()>& procFunc);
private:
FiberExecutor(const FiberExecutor&) = default;
FiberExecutor& operator=(const FiberExecutor&) = default;
private:
std::unique_ptr<boost::fibers::buffered_channel<std::shared_ptr<FiberProc>>> m_channel;
std::unique_ptr<std::thread> m_thread;
#endif
源文件:fiber_executor.cpp
#include "fiber_executor.h"
FiberProc::FiberProc(const std::function<void()>& func, std::size_t stackSize)
: m_func(func)
, m_stackSize(stackSize)
, m_cancelled(false)
FiberProc::~FiberProc(void)
void FiberProc::run(void)
if (m_func)
m_func();
void FiberProc::cancel(void)
m_cancelled = true;
bool FiberProc::isCancelled(void)
return m_cancelled;
FiberExecutor::FiberExecutor(std::size_t channelCapacity)
assert(channelCapacity >= 2);
m_channel = std::make_unique<boost::fibers::buffered_channel<std::shared_ptr<FiberProc>>>(channelCapacity);
std::promise<void> result;
m_thread = std::make_unique<std::thread>([this, &result] {
result.set_value();
std::shared_ptr<FiberProc> proc;
while (boost::fibers::channel_op_status::closed != m_channel->pop(proc))
boost::fibers::fiber(std::allocator_arg, boost::fibers::default_stack(proc->m_stackSize), [proc]() {
if (!proc->isCancelled()) {
proc->run();
}).detach();
});
result.get_future().get();
FiberExecutor::~FiberExecutor(void)
m_channel->close();
m_thread->join();
void FiberExecutor::join(void)
m_thread->join();
std::shared_ptr<FiberProc> FiberExecutor::post(const std::shared_ptr<FiberProc>& procObj)
m_channel->push(procObj);
return procObj;
std::shared_ptr<FiberProc> FiberExecutor::post(const std::function<void()>& procFunc)
std::shared_ptr<FiberProc> procObj = std::make_shared<FiberProc>(procFunc);
m_channel->push(procObj);
return procObj;
#include <chrono>
#include <iostream>
#include <string>
#include "fiber_executor.h"
static FiberExecutor s_executor(16);
void print(int num)
for (int i = 0; i < 2; ++i)
std::cout << "--- num: " << num << ", i: " << i << " --- start\n";
if (0 == num % 2) {
boost::fibers::promise<void> result;
s_executor.post([num, i, &result] {
std::cout << "--- num: " << num << ", i: " << i << " --- sleep\n";
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
result.set_value();
});
result.get_future().get();
std::cout << "--- num: " << num << ", i: " << i << " --- end\n";
int main()
for (int num = 0; num < 10; ++num)
std::cout << "++++++++++ " << num << " +++ start\n";
s_executor.post([num] {
print(num);
});
std::cout << "++++++++++ " << num << " +++ end\n";
std::this_thread::sleep_for(std::chrono::milliseconds(50));
return 0;
一、概述 Boost.Fiber是一种微线程(用户层),也可以叫作纤程(协程),与一般的协程相比,其内部提供了调度管理器。每个fiber都有自己的栈,它可以保存当前的执行状态,包括所有寄存器的CPU标志、指令指针和堆栈指针,然后可以从此状态恢复。其目的是在单个线程上通过协作调度运行多个可执行序列(即函数)。正在运行的fiber可以明确的决定什么时候yield,来允许另外一个fiber运行(上下文切换)。在x86上
boost::fibers::launch::dispatch的测试程序实现功能C++实现代码
boost::fibers::launch::dispatch的测试程序
C++实现代码
#include <boost/assert.hpp>
#include <boost/test/unit_test.hpp>
#include <boost/fiber/all.hpp>
#include <chrono>
#include <sstream&
上下文简介
首先要理解boost::context的概念和应用场景。程序在执行的时候,当前的执行的代码环境和所处的状态,就是context。boost::context保留了当前程序执行时的寄存器等的状态,可以认为是一个上下文A;然后线程就可以去执行其他的代码,完成执行后,可以切回上下文A,并从当初切走的地方执行,而且当初的上下文的现场不变,这就是完成了一次真正意义上的上下文切换。
上线文切换,在协程和用户态线程等有重要的意义(统称它们为routine),我们可以启动一定数量的操作系统的线程,然后让rout
boost::fibers::algo::shared_work >用法的测试程序实现功能C++实现代码
boost::fibers::algo::shared_work >用法的测试程序
C++实现代码
#include <boost/assert.hpp>
#include <boost/fiber/all.hpp>
#include <boost/fiber/detail/thread_barrier.hpp>
#include <chr
Boost库是一个流行的C++库,是C++标准库的一个有益补充。在使用时我们需要注意Boost库的版本与编译器的兼容性。
在这里,"msvc14.2"是指Microsoft Visual Studio编译器的版本号。目前而言,最新的msvc(Microsoft Visual C++)版本是14.2,对应于Visual Studio 2019。如果我们想在Visual Studio 2019中使用Boost库,我们需要下载适用于该版本的Boost库源代码,并在Visual Studio 2019中编译安装。
首先,我们需要从Boost官方网站(https://www.boost.org/)下载最新的Boost库源代码。接着,我们需要解压缩下载的代码,并使用Visual Studio 2019打开解压后的文件夹。
然后,在Visual Studio 2019中打开解压后的Boost库源代码文件夹,我们可以在其中找到一个名为"bootstrap.bat"的批处理文件。我们需要双击运行该文件,这将会通过运行b2工具,自动为我们生成编译配置。
接下来,我们需要使用命令提示符窗口(Command Prompt)进入到Boost库源代码文件夹的根目录,并运行以下命令:
```shell
这将会开始编译并安装Boost库。编译过程可能需要一些时间,取决于你的计算机性能和Boost库的组件数量。完成后,我们便成功安装了Boost库。
最后,我们可以在Visual Studio 2019中新建一个C++项目,并在项目属性中配置Boost库的路径。这样,我们就可以在项目中引入Boost库的头文件并使用其中的功能了。
总而言之,对于msvc14.2版本(指Visual Studio 2019)的Boost库安装,我们需要下载最新的Boost库源代码,并在Visual Studio 2019中编译安装。完成后,我们便可以在项目中使用Boost库的功能了。
### 回答2:
Boost库是一个开源的C++库,提供了许多与C++标准库相比还要更强大的功能和工具。MSVC14.2指的是Microsoft Visual C++(MSVC)编译器的版本号。
Boost库和MSVC编译器之间的关系是:Boost库可以在不同的C++编译器中使用,包括MSVC编译器。而MSVC编译器的版本号14.2表示它属于Visual Studio 2019的一部分,所以在使用Boost库时,我们需要根据具体的MSVC版本来选择合适的Boost版本。
对于MSVC 14.2(Visual Studio 2019),可以使用Boost库的最新版本。Boost官方网站会提供有关不同版本和编译器之间的兼容性信息。在下载Boost库时,我们需要注意选择与我们正在使用的MSVC版本兼容的Boost版本。
在使用Boost库之前,我们还需要确保正确配置了MSVC编译器的相关设置。在Visual Studio 2019中使用Boost库的过程大致如下:
1. 下载并解压缩Boost库的最新版本。
2. 打开Visual Studio 2019,创建一个新项目或打开现有项目。
3. 在项目属性中,选择C/C++ -> 常规,将Boost库的include目录添加到附加包含目录中。
4. 在链接器 -> 常规中,将Boost库的lib目录添加到附加库目录中。
5. 在链接器 -> 输入中,将Boost库的库文件(.lib)添加到附加依赖项中。
6. 在代码中,使用#include <boost/...>来引入所需的Boost库头文件,并编写相应的代码。
总之,Boost库可以与MSVC14.2(Visual Studio 2019)一起使用。需要注意的是选择与MSVC版本兼容的Boost库版本,并正确配置项目属性来使用Boost库的功能。
### 回答3:
boost库msvc14.2是指适用于Microsoft Visual Studio 2019的boost库版本。boost库是一个开源的C++扩展库,提供了很多功能强大且易于使用的工具和组件,用于增强C++编程的能力。
msvc14.2表示该boost库版本适用于使用Microsoft Visual Studio 2019的C++开发环境。Msvc14.2是VS2019的默认工具集版本号,其中msvc表示Microsoft Visual C++,14.2表示Major版本为14,Minor版本为2。
使用boost库msvc14.2可以获得许多优势。首先,boost库提供了丰富的函数、类和模板,用于处理各种常见的编程任务,如字符串处理、容器操作、多线程编程等。这些功能可以帮助开发人员提高开发效率,减少代码量,从而提升软件的质量和性能。
其次,boost库具有良好的移植性和跨平台性。无论是在Windows、Linux还是其他操作系统上,boost库都可以正常工作,并且提供了一致的API接口,确保了代码的可移植性。
此外,boost库还支持最新的C++标准,提供了许多新特性和扩展,可以帮助开发人员更好地利用和实践现代C++编程中的新概念和技术。
总结来说,boost库msvc14.2是一套功能强大且适用于Microsoft Visual Studio 2019的C++扩展库,可以为开发人员提供更多可能性和便利性,使得他们能够更轻松地开发出高质量、高性能的应用程序。