use win32 api with IOCP and Overlapped IO to read file
- Call CreateIoCompletionPort function to create a IOCP handle
- Call the CreateIoCompletionPort function again to associate the IOCP handle with the device handle
- According to the number of processors, create cpu * 2 worker threads
- Call GetQueuedCompletionStatus function within the worker threads, get the result after calling, and push the result into the IO thread's queue for callback