RAII非常舒适,我很难为必须以获取资源的相同顺序(FIFO)释放资源而不是从RAII中自然产生的相反顺序(堆栈)释放资源提供等效设计。] >
在我的特定情况下,我有一个stream
类,如下所示:
template<typename T> class stream { ... public: // Producer API T& write_acquire(); // This acquires a storage element and will "block" // until a slot is available in the underlying resource void write_release(&T); // This releases the storage element, transferring the data to a consumer // Consumer API T& read_acquire(); // This acquires a storage element and will "block" // until a slot has been write_release void read_release(&T); // This releases the storage element making it available // for a potential future write_acquire };
[我当时正在考虑提供RAII风格的助手:
template<typename T> class stream_wslot { stream<T> &s; T &slot; public: stream_wslot(stream<T> &s) : s{s}, slot{s.write_acquire()} {} ~stream_wslot() { s.write_release(slot); } operator T&() { return slot; } T& operator=(T &val) { return slot = val; } };
但是问题在于以下用法将无法正确执行:
void test(stream<float> &fifo) { stream_wslot even(fifo); stream_wslot odd(fifo); ... first ... ... second ... // releases odd !!! // releases even }
即,在释放
odd
插槽之前,我们将释放even
插槽。虽然我可以在stream
中添加“重新排序”队列,但我想知道是否存在将RAII推广到那些情况的“干净”方法。
RAII非常舒适,我很难为必须以与获取时相同的顺序释放它们的资源(FIFO)进行释放提供等效设计,而不是相反...