相当于FIFO释放顺序的RAII

问题描述 投票:1回答:1

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)进行释放提供等效设计,而不是相反...

c++ raii
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.