Async++ 源码分析:continuation_vector.h
continuation_vector.h 是 Async++ 库中用于管理异步任务延续(continuation)的核心数据结构。该文件实现了一个高效的、线程安全的动态数组,专为存储和管理任务的延续操作而设计。以下是对该文件的详细分析。
continuation_vector 的设计目标
continuation_vector 的主要目标是提供一种高效的方式来存储和管理任务的延续操作。在异步编程中,一个任务完成后可能需要执行多个后续操作,这些操作需要以某种顺序或条件触发。continuation_vector 通过动态数组的形式存储这些操作,并确保线程安全。
该数据结构需要满足以下要求:
- 动态扩容:能够根据需求动态调整存储空间。
- 线程安全:支持多线程环境下的安全访问。
- 高效插入和删除:延续操作的插入和删除操作需要高效。
continuation_vector 的核心实现
continuation_vector 的实现基于一个动态数组,并通过原子操作确保线程安全。以下是其核心代码片段:
template <typename T>
class continuation_vector {
private:
std::atomic<T*> _data;
std::atomic<size_t> _size;
std::atomic<size_t> _capacity;
public:
continuation_vector() : _data(nullptr), _size(0), _capacity(0) {}
~continuation_vector() {
delete[] _data.load(std::memory_order_relaxed);
}
void push_back(T value) {
size_t old_size = _size.fetch_add(1, std::memory_order_acq_rel);
if (old_size >= _capacity.load(std::memory_order_acquire)) {
grow_capacity();
}
_data.load(std::memory_order_acquire)[old_size] = std::move(value);
}
private:
void grow_capacity() {
size_t old_capacity = _capacity.load(std::memory_order_acquire);
size_t new_capacity = old_capacity == 0 ? 1 : old_capacity * 2;
T* new_data = new T[new_capacity];
T* old_data = _data.exchange(new_data, std::memory_order_acq_rel);
std::copy(old_data, old_data + old_capacity, new_data);
delete[] old_data;
_capacity.store
46

被折叠的 条评论
为什么被折叠?



