2014-03-19 4 views
0

기사를 찾았습니다. 매우 흥미 롭습니다. 내가 머리를 감쌀 수없는 한 가지가있다. (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 클래스를 구현하기 위해 노력했다. 어쩌면 누군가가 그것에 대해 조금 더 설명 할 수 있습니다. 자세한 정보가 필요하면 알려주십시오.

+0

OsAsyncFileOperation 생성자를 볼 수 없으므로 어떻게 보이는지 추측 할 필요가 없습니다. –

+0

컴파일러에서 사용할 수있는 경우'std :: shared_ptr'을 사용하여'ReferenceCountedItem'을 대체 할 수 있다고 생각합니다. – Luis

답변

0

저자가 new 또는 GlobalAlloc과 함께 힙에 OVERLAPPED 구조체를 할당하는 부분이 있습니다. 그런 다음 복사 생성자에서 operator=, 그는 포인터를 복사하고 있습니다. 포인터를 사용하는 객체가 여러 개있을 수 있으므로 참조 카운팅을 사용하여 OVERLAPPED 포인터를 삭제해도 괜찮은지 알 수 있습니다.

+0

나는 당신이 무슨 뜻인지 잘 모르겠다. OVERLAPPED 구조체가'ReadAsync' 또는'WriteAsync' 내부에 할당되지 않았습니까? (OVERLAPPED 구조체가있는 ReadFile 및 WriteFile에 대한 호출이 거기에서 발생하기 때문에)? 포인터에 관한'OsAsyncFileOperation'은 어떻게 될까요? – puelo

+0

답하기 위해서는'ReadAsync()'와'WriteAsync()'의 구현을 봐야 할 것입니다. 우리는 여기서 그것을 볼 수 없습니다. 그들은 새로운'OsAsyncFileOperation'에'OVERLAPPED' 포인터를 얻기 위해 내부 속임수를 사용하고 있거나 기사가 코드가 실제로 무엇을하는지 정확하게 반영하지 못합니다. –

+0

좋아. 그것은 내가 생각하고 있던 것입니다. 내가 뭔가를 놓치고 있는지 확실하지 않았다. 고맙습니다. – puelo