Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <windows.h>
- #include <cstdlib>
- #include <random>
- using namespace std;
- size_t const BLOCK_SIZE = 4096;
- size_t const NUM_BLOCKS = ((size_t)1024 * 1024 * 1024 / BLOCK_SIZE);
- size_t const FILE_SIZE = NUM_BLOCKS * BLOCK_SIZE;
- DWORD WINAPI ReaderThread( LPVOID lpvThreadParam );
- int main()
- {
- HANDLE hFile;
- OVERLAPPED ol;
- BYTE abBlock[BLOCK_SIZE];
- int const THREADS = 500;
- if( (hFile = CreateFile( TEXT("testfile"), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED, NULL )) == INVALID_HANDLE_VALUE )
- return EXIT_FAILURE;
- ol.Offset = FILE_SIZE - BLOCK_SIZE;
- ol.OffsetHigh = 0;
- if( (ol.hEvent = CreateEvent( NULL, FALSE, FALSE, NULL )) == NULL ||
- !WriteFile( hFile, abBlock, BLOCK_SIZE, NULL, &ol ) && GetLastError() != ERROR_IO_PENDING )
- return EXIT_FAILURE;
- for( int thread = 0; thread < THREADS; thread++ )
- CreateThread( NULL, 0, ReaderThread, hFile, 0, NULL );
- Sleep( INFINITE );
- return EXIT_SUCCESS;
- }
- DWORD WINAPI ReaderThread( LPVOID lpvThreadParam )
- {
- HANDLE hFile = (HANDLE)lpvThreadParam;
- random_device rd;
- mt19937 mt( rd() );
- uniform_int_distribution<DWORD> uid( 0, FILE_SIZE - BLOCK_SIZE );
- HANDLE hEvent;
- if( (hEvent = CreateEvent( NULL, FALSE, FALSE, NULL )) == NULL )
- ExitProcess( EXIT_FAILURE );
- for( ; ; )
- {
- OVERLAPPED ol;
- BYTE abBlock[BLOCK_SIZE];
- ol.Offset = uid( mt ) & (DWORD)-(LONG)BLOCK_SIZE;
- ol.OffsetHigh = 0;
- ol.hEvent = hEvent;
- if( !ReadFile( hFile, abBlock, BLOCK_SIZE, NULL, &ol ) && GetLastError() != ERROR_IO_PENDING ||
- WaitForSingleObject( hEvent, INFINITE ) != WAIT_OBJECT_0 )
- ExitProcess( EXIT_FAILURE );
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment