# workspace
**workspace**是基于C++11的轻量级异步执行框架,支持:通用任务异步执行、优先级任务调度、自适应动态线程池、高效静态线程池、异常处理机制等。
## 目录
- [特点](#特点)
- [模块简介](#主要模块)
- [workbranch](#workbranch)
- [supervisor](#supervisor)
- [workspace](#workspace)
- [辅助模块](#辅助模块)
- [futures](#futures)
- [benchmark](#benchmark)
- [如何使用](#如何使用)
- [注意事项](#注意事项)
- [其它](#其它)
## 特点
- 轻量的:Header-Only & 代码量 <= 1000行 & 接口简单。
- 高效的:超轻量级任务支持异步顺序执行,提高了框架的并发性能。
- 灵活的:支持多种任务类型、动态线程调整、可通过workspace构建不同的池模型。
- 稳定的:利用`std::function`的小任务优化减少内存碎片、拥有良好的异步线程异常处理机制。
- 兼容性:纯C++11实现,跨平台,且兼容C++11以上版本。
## 主要模块
### **workbranch**
**workbranch**(工作分支)是动态线程池的抽象,内置了一条线程安全的**任务队列**用于同步任务。其管理的每一条异步工作线程被称为**worker**,负责从任务队列不断获取任务并执行。(以下示例按顺序置于`workspace/example/`)
<br>
让我们先简单地提交一点任务,当你的任务带有返回值时,workbranch会返回一个std::future,否则返回void。
```c++
#include <workspace/workspace.h>
int main() {
// 2 threads
wsp::workbranch br(2);
// return void
br.submit([]{ std::cout<<"hello world"<<std::endl; });
// return std::future<int>
auto result = br.submit([]{ return 2023; });
std::cout<<"Got "<<result.get()<<std::endl;
// wait for tasks done (timeout: 1000 milliseconds)
br.wait_tasks(1000);
}
```
由于返回一个std::future会带来一定的开销,如果你不需要返回值并且希望程序跑得更快,那么你的任务应该是`void()`类型的。
<br>
当你有一个任务并且你希望它能尽快被执行时,你可以指定该任务的类型为`urgent`,如下:
```C++
#include <workspace/workspace.h>
int main() {
// 1 threads
wsp::workbranch br;
br.submit<wsp::task::nor>([]{ std::cout<<"task B done\n";}); // normal task
br.submit<wsp::task::urg>([]{ std::cout<<"task A done\n";}); // urgent task
br.wait_tasks(); // wait for tasks done (timeout: no limit)
}
```
在这里我们通过指定任务类型为`wsp::task::urg`,来提高任务的优先级。最终
在我的机器上:
```shell
jack@xxx:~/workspace/example/build$ ./e2
task A done
task B done
```
在这里我们不能保证`task A`一定会被先执行,因为当我们提交`task A`的时候,`task B`可能已经在执行中了。`urgent`标签可以让任务被插入到队列头部,但无法改变已经在执行的任务。
<br>
假如你有几个轻量异步任务,执行他们只需要**非常短暂**的时间。同时,按照**顺序执行**它们对你来说没有影响,甚至正中你下怀。那么你可以把任务类型指定为`sequence`,以便提交一个**任务序列**。这个任务序列会被单个线程顺序执行:
```c++
#include <workspace/workspace.h>
int main() {
wsp::workbranch br;
// sequence tasks
br.submit<wsp::task::seq>([]{std::cout<<"task 1 done\n";},
[]{std::cout<<"task 2 done\n";},
[]{std::cout<<"task 3 done\n";},
[]{std::cout<<"task 4 done\n";});
// wait for tasks done (timeout: no limit)
br.wait_tasks();
}
```
任务序列会被打包成一个较大的任务,以此来减轻框架同步任务的负担,提高整体的并发性能。
<br>
当任务中抛出了一个异常,workbranch有两种处理方式:A-将其捕获并输出到终端 B-将其捕获并通过std::future传递到主线程。第二种需要你提交一个**带返回值**的任务。
```C++
#include <workspace/workspace.h>
// self-defined
class excep: public std::exception {
const char* err;
public:
excep(const char* err): err(err) {}
const char* what() const noexcept override {
return err;
}
};
int main() {
wsp::workbranch wbr;
wbr.submit([]{ throw std::logic_error("A logic error"); }); // log error
wbr.submit([]{ throw std::runtime_error("A runtime error"); }); // log error
wbr.submit([]{ throw excep("XXXX");}); // log error
auto future1 = wbr.submit([]{ throw std::bad_alloc(); return 1; }); // catch error
auto future2 = wbr.submit([]{ throw excep("YYYY"); return 2; }); // catch error
try {
future1.get();
} catch (std::exception& e) {
std::cerr<<"Caught error: "<<e.what()<<std::endl;
}
try {
future2.get();
} catch (std::exception& e) {
std::cerr<<"Caught error: "<<e.what()<<std::endl;
}
}
```
在我的机器上:
```
jack@xxx:~/workspace/test/build$ ./test_exception
workspace: worker[140509071521536] caught exception:
what(): A logic error
workspace: worker[140509071521536] caught exception:
what(): A runtime error
workspace: worker[140509071521536] caught exception:
what(): XXXX
Caught error: std::bad_alloc
Caught error: YYYY
```
---
### **supervisor**
supervisor是异步管理者线程的抽象,负责监控workbranch的负载情况并进行动态调整。它允许你在每一次调控workbranch之后执行一个小任务,你可以用来**写日志**或者做一些其它调控等。
<br>
每一个supervisor可以管理多个workbranch。此时workbranch之间共享supervisor的所有设定。
```c++
#include <workspace/workspace.h>
int main() {
wsp::workbranch br1(2);
wsp::workbranch br2(2);
// 2 <= thread number <= 4
// time interval: 1000 ms
wsp::supervisor sp(2, 4, 1000);
sp.set_tick_cb([&br1, &br2]{
auto now = std::chrono::system_clock::now();
std::time_t timestamp = std::chrono::system_clock::to_time_t(now);
std::tm local_time = *std::localtime(×tamp);
static char buffer[40];
std::strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &local_time);
std::cout<<"["<<buffer<<"] "<<"br1: [workers] "<<br1.num_workers()<<" | [blocking-tasks] "<<br1.num_tasks()<<'\n';
std::cout<<"["<<buffer<<"] "<<"br2: [workers] "<<br2.num_workers()<<" | [blocking-tasks] "<<br2.num_tasks()<<'\n';
});
sp.supervise(br1); // start supervising
sp.supervise(br2); // start supervising
for (int i = 0; i < 1000; ++i) {
br1.submit([]{std::this_thread::sleep_for(std::chrono::milliseconds(10));});
br2.submit([]{std::this_thread::sleep_for(std::chrono::milliseconds(20));});
}
br1.wait_tasks();
br2.wait_tasks();
}
```
在我的机器上,输出如下:
```
jack@xxx:~/workspace/example/build$ ./e4
[2023-06-13 12:24:31] br1: [workers] 4 | [blocking-tasks] 606
[2023-06-13 12:24:31] br2: [workers] 4 | [blocking-tasks] 800
[2023-06-13 12:24:32] br1: [workers] 4 | [blocking-tasks] 213
[2023-06-13 12:24:32] br2: [workers] 4 | [blocking-tasks] 600
[2023-06-13 12:24:33] br1: [workers] 4 | [blocking-tasks] 0
[2023-06-13 12:24:33] br2: [workers] 4 | [blocking-tasks] 404
[2023-06-13 12:24:34] br1: [workers] 3 | [blocking-tasks] 0
[2023-06-13 12:24:34] br2: [workers] 4 | [blocking-tasks] 204
[2023-06-13 12:24:35] br1: [workers] 2 | [blocking-tasks] 0
[2023-06-13 12:24:35] br2: [workers] 4 | [blocking-tasks] 4
[2023-06-13 12:24:35] br1: [workers] 2 | [blocking-tasks] 0
[2023-06-13 12:24:35] br2: [workers] 4 | [blocking-tasks] 0
```
---
### **workspace**
workspace是一个**托管器**/**任务分发器**,你可以将workbranch和supervisor托管给它,并用workspace分配的**组件专属ID**来访问它们。将组件托管至workspace至少有以下几点好处:
- 堆内存正确释放:workspace在内部
没有合适的资源?快使用搜索试试~ 我知道了~
workspace是基于C++11的轻量级异步执行框架,
共34个文件
cc:16个
h:7个
txt:6个
需积分: 5 0 下载量 134 浏览量
2024-06-03
15:56:33
上传
评论
收藏 33KB ZIP 举报
温馨提示
C++是一种广泛使用的编程语言,它是由Bjarne Stroustrup于1979年在新泽西州美利山贝尔实验室开始设计开发的。C++是C语言的扩展,旨在提供更强大的编程能力,包括面向对象编程和泛型编程的支持。C++支持数据封装、继承和多态等面向对象编程的特性和泛型编程的模板,以及丰富的标准库,提供了大量的数据结构和算法,极大地提高了开发效率。12 C++是一种静态类型的、编译式的、通用的、大小写敏感的编程语言,它综合了高级语言和低级语言的特点。C++的语法与C语言非常相似,但增加了许多面向对象编程的特性,如类、对象、封装、继承和多态等。这使得C++既保持了C语言的低级特性,如直接访问硬件的能力,又提供了高级语言的特性,如数据封装和代码重用。13 C++的应用领域非常广泛,包括但不限于教育、系统开发、游戏开发、嵌入式系统、工业和商业应用、科研和高性能计算等领域。在教育领域,C++因其结构化和面向对象的特性,常被选为计算机科学和工程专业的入门编程语言。在系统开发领域,C++因其高效性和灵活性,经常被作为开发语言。游戏开发领域中,C++由于其高效性和广泛应用,在开发高性能游戏和游戏引擎中扮演着重要角色。在嵌入式系统领域,C++的高效和灵活性使其成为理想选择。此外,C++还广泛应用于桌面应用、Web浏览器、操作系统、编译器、媒体应用程序、数据库引擎、医疗工程和机器人等领域。16 学习C++的关键是理解其核心概念和编程风格,而不是过于深入技术细节。C++支持多种编程风格,每种风格都能有效地保证运行时间效率和空间效率。因此,无论是初学者还是经验丰富的程序员,都可以通过C++来设计和实现新系统或维护旧系统。3
资源推荐
资源详情
资源评论
收起资源包目录
workspace是基于C++11的轻量级异步执行框架,支持:通用任务异步并发执行、优先级任务调度、自适应动态线程池、高效静态线程池、异常处理机制等。.zip (34个子文件)
content
include
workspace
utility.h 2KB
taskqueue.h 1KB
autothread.h 953B
supervisor.h 4KB
workbranch.h 9KB
workspace.h 8KB
CMakeLists.txt 230B
benchmark
CMakeLists.txt 444B
timewait.h 897B
bench2.cc 904B
bench1.cc 780B
bench3.cc 907B
.clang-format 5KB
LICENSE.txt 11KB
doxygen.conf 1KB
.clang-tidy 5KB
bench.md 6KB
test
CMakeLists.txt 686B
test_exception.cc 989B
test_supervisor.cc 2KB
test_workspace.cc 1KB
test_workbranch.cc 952B
bench
CMakeLists.txt 715B
bench2.cc 2KB
bench1.cc 1KB
bench3.cc 1KB
example
CMakeLists.txt 664B
e6.cc 424B
e3.cc 395B
e4.cc 1KB
e2.cc 333B
e1.cc 388B
e5.cc 694B
README.md 14KB
共 34 条
- 1
资源评论
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 下载.png112分v额且财务去去
- devecostudio-windows-4.1.0.400
- STSPIN32G4-demo板资料
- 昆虫害虫检测54-YOLO(v5至v9)、COCO、CreateML、Darknet、Paligemma、TFRecord、VOC数据集合集.rar
- jetbrains-JetBrains公司的IDE介绍及其在软件开发中的应用
- 284.基于java的旅游网站(含报告).zip
- python selenium爬虫用的浏览器和驱动96.0.4664.45
- 算法实现排序算法 Python 实现.zip
- JavaWeb资源代码文档资料.zip
- 哈希表-数据结构领域哈希表的概念、操作与应用场景
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功