0

とても興味深い記事を見つけました。頭を包み込めないことが1つだけあります。( http://molecularmusings.wordpress.com/2011/08/31/file-system-part-1-platform-specific-api-design/ ) 著者は、同期および非同期のファイル操作を処理できる File クラスについて説明しています。 . 非同期操作の場合、彼は非同期操作を内部的に追跡する自己完結型のオブジェクトを使用します。クラスは次のようになります。

class OsAsyncFileOperation
{
public:
  OsAsyncFileOperation(HANDLE file, size_t position);
  OsAsyncFileOperation(const OsAsyncFileOperation& other);
  OsAsyncFileOperation& operator=(const OsAsyncFileOperation& other);
  ~OsAsyncFileOperation(void);

  /// Returns whether or not the asynchronous operation has finished
  bool HasFinished(void) const;

  /// Waits until the asynchronous operation has finished. Returns the number of transferred bytes.
  size_t WaitUntilFinished(void) const;

  /// Cancels the asynchronous operation
  void Cancel(void);

private:
  HANDLE m_file;
  ReferenceCountedItem<OVERLAPPED>* m_overlapped;
};

そして、次のように使用されます。

OsAsyncFileOperation ReadAsync(void* buffer, size_t length, size_t position);

今、私は疑問に思っています:ReferenceCountedItem<OVERLAPPED>* m_overlapped;変数の役割は何ですか? これがどういうわけか参照をカウントすることは知っていますが、特にコンストラクターに構造が渡されていないため、ここでどのように使用されているかわかりませんOVERLAPPED。orメソッドOVERLAPPEDで使用される構造体について、このクラスはどうなりますか? 記事では指定されていないため、クラスを実装しようとしました。ReadAsyncWriteAsyncReferenceCountedItem

#pragma once

template <typename T>
class ReferenceCountedItem {

public:
    ReferenceCountedItem(T* data) :m_data(data), m_refCounter(1)
    {}

    ~ReferenceCountedItem() {}

    int addReference()
    {
        return ++this->m_refCounter;
    }

    int removeReference()
    {
        return --this->m_refCounter;
    }

private:
    T* m_data;
    int m_refCounter;
};

これがどのようにつながっているのか、私にはほとんどわかりません。誰かがそれについてもう少し説明できるかもしれません。さらに情報が必要な場合は、お知らせください。

4

1 に答える 1