Я нашел статью, которую нахожу довольно интересной. Есть только одна вещь, которую я не могу обернуть вокруг себя.
(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
состав. Как этот класс сейчас о OVERLAPPED
структура, используемая в ReadAsync
или же WriteAsync
метод?
Я пытался реализовать ReferenceCountedItem
класс, так как он не указан в статье:
#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;
};
Я в основном не уверен, как все это склеивается. Может быть, кто-то может объяснить немного больше об этом. Если вам нужна дополнительная информация, пожалуйста, дайте мне знать.
Где-то автор размещает структуру OVERLAPPED в куче, new
или же GlobalAlloc
, Затем в конструкторе копирования и operator=
он копирует указатель. Поскольку указатель может быть несколько объектов, он использует подсчет ссылок, чтобы узнать, когда можно удалить указатель OVERLAPPED.
Других решений пока нет …