기사를 찾았습니다. 매우 흥미 롭습니다. 내가 머리를 감쌀 수없는 한 가지가있다. (http://molecularmusings.wordpress.com/2011/08/31/file-system-part-1-platform-specific-api-design/) 저자는 동기 및 비동기 파일 작업을 처리 할 수있는 File 클래스에 대해 설명합니다. 비동기 작업의 경우 내부적으로 비동기 작업을 추적하는 자체 포함 개체를 사용합니다.OVERLAPPED 구조의 참조 횟수
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
구조를 전달하지 않는 이후 특히 여기에 어떻게 사용되는지 잘 모르겠습니다. 이 클래스는 현재 ReadAsync
또는 WriteAsync
메서드에서 사용되는 OVERLAPPED
구조체에 대해 어떻게됩니까?
#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;
};
나는이 모두가 서로 붙지 방법의 대부분은 확실치 :이 기사에 지정되지 않기 때문에 나는 ReferenceCountedItem
클래스를 구현하기 위해 노력했다. 어쩌면 누군가가 그것에 대해 조금 더 설명 할 수 있습니다. 자세한 정보가 필요하면 알려주십시오.
OsAsyncFileOperation 생성자를 볼 수 없으므로 어떻게 보이는지 추측 할 필요가 없습니다. –
컴파일러에서 사용할 수있는 경우'std :: shared_ptr'을 사용하여'ReferenceCountedItem'을 대체 할 수 있다고 생각합니다. – Luis