Guest User

Untitled

a guest
Apr 30th, 2017
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.80 KB | None | 0 0
  1. #include <windows.h>
  2. #include <cstdlib>
  3. #include <random>
  4.  
  5. using namespace std;
  6.  
  7. size_t const BLOCK_SIZE = 4096;
  8. size_t const NUM_BLOCKS = ((size_t)1024 * 1024 * 1024 / BLOCK_SIZE);
  9. size_t const FILE_SIZE  = NUM_BLOCKS * BLOCK_SIZE;
  10.  
  11. DWORD WINAPI ReaderThread( LPVOID lpvThreadParam );
  12.  
  13. int main()
  14. {
  15.     HANDLE     hFile;
  16.     OVERLAPPED ol;
  17.     BYTE       abBlock[BLOCK_SIZE];
  18.     int const  THREADS = 500;
  19.  
  20.     if( (hFile = CreateFile( TEXT("testfile"), GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_NO_BUFFERING | FILE_FLAG_OVERLAPPED, NULL )) == INVALID_HANDLE_VALUE )
  21.         return EXIT_FAILURE;
  22.  
  23.     ol.Offset = FILE_SIZE - BLOCK_SIZE;
  24.     ol.OffsetHigh = 0;
  25.     if( (ol.hEvent = CreateEvent( NULL, FALSE, FALSE, NULL )) == NULL ||
  26.         !WriteFile( hFile, abBlock, BLOCK_SIZE, NULL, &ol ) && GetLastError() != ERROR_IO_PENDING )
  27.         return EXIT_FAILURE;
  28.  
  29.     for( int thread = 0; thread < THREADS; thread++ )
  30.         CreateThread( NULL, 0, ReaderThread, hFile, 0, NULL );
  31.  
  32.     Sleep( INFINITE );
  33.  
  34.     return EXIT_SUCCESS;
  35. }
  36.  
  37. DWORD WINAPI ReaderThread( LPVOID lpvThreadParam )
  38. {
  39.     HANDLE                          hFile = (HANDLE)lpvThreadParam;
  40.     random_device                   rd;
  41.     mt19937                         mt( rd() );
  42.     uniform_int_distribution<DWORD> uid( 0, FILE_SIZE - BLOCK_SIZE );
  43.     HANDLE                          hEvent;
  44.  
  45.     if( (hEvent = CreateEvent( NULL, FALSE, FALSE, NULL )) == NULL )
  46.         ExitProcess( EXIT_FAILURE );
  47.  
  48.     for( ; ; )
  49.     {
  50.         OVERLAPPED ol;
  51.         BYTE       abBlock[BLOCK_SIZE];
  52.  
  53.         ol.Offset     = uid( mt ) & (DWORD)-(LONG)BLOCK_SIZE;
  54.         ol.OffsetHigh = 0;
  55.         ol.hEvent     = hEvent;
  56.         if( !ReadFile( hFile, abBlock, BLOCK_SIZE, NULL, &ol ) && GetLastError() != ERROR_IO_PENDING ||
  57.             WaitForSingleObject( hEvent, INFINITE ) != WAIT_OBJECT_0 )
  58.             ExitProcess( EXIT_FAILURE );
  59.     }
  60. }
Advertisement
Add Comment
Please, Sign In to add comment