// OSSP-03.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include #include #include #include const unsigned int S = 500 * 1024 * 1024/sizeof (int); struct param{ char* name; int num; int count; }; void create_file(char*); unsigned int _stdcall search_number(void*); int _tmain(int argc, _TCHAR* argv[]) { unsigned int sr[5]; HANDLE handle[5]; struct param par1 = { "demo01.bin", 5, 0 }; struct param par2 = { "demo02.bin", 121, 0 }; struct param par3 = { "demo03.bin", 157, 0 }; struct param par4 = { "demo04.bin", 213, 0 }; struct param par5 = { "demo05.bin", 307, 0 }; srand((unsigned int)time(NULL)); /*create_file("demo01.bin"); create_file("demo02.bin"); create_file("demo03.bin"); create_file("demo04.bin"); create_file("demo05.bin");*/ //search_number(&par1); handle[0] = (HANDLE)_beginthreadex(NULL, 0, search_number, &par1, 0, &sr[0]); handle[1] = (HANDLE)_beginthreadex(NULL, 0, search_number, &par2, 0, &sr[1]); handle[2] = (HANDLE)_beginthreadex(NULL, 0, search_number, &par3, 0, &sr[2]); handle[3] = (HANDLE)_beginthreadex(NULL, 0, search_number, &par4, 0, &sr[3]); handle[4] = (HANDLE)_beginthreadex(NULL, 0, search_number, &par5, 0, &sr[4]); WaitForMultipleObjects(5, handle, TRUE, INFINITE); printf("%d\n", par1.count); printf("%d\n", par2.count); printf("%d\n", par3.count); printf("%d\n", par4.count); printf("%d\n", par5.count); return 0; } void create_file(char* name) { FILE *f; errno_t err; int number; err = fopen_s(&f, name, "wb"); for (unsigned int i = 0; i < S; i++) { number = rand(); fwrite(&number, sizeof(int), 1, f); if (i % 10000 == 0) printf("%f\n", i*1.0 / S); } fclose(f); } unsigned int _stdcall search_number(void* p) { DWORD t = GetTickCount(); FILE *f; int number, i = 0, *mas; size_t N; errno_t err; mas = (int*)calloc(25600, sizeof(int)); struct param* pr = (struct param*)p; err = fopen_s(&f,pr-> name, "rb"); if (err == 0) { printf("filename %s\n", pr->name); do { N = fread(mas, sizeof(int), 25600, f); //printf("N= %d filename %s\n", N, pr->name); for (int j = 0; j < N; j++) { if (mas[j] == pr->num) pr->count++; } //if (++i % 10000 == 0) // printf("%f\n", i*1.0 / S); } while (N); } printf("N= %d filename %s\n", N, pr->name); free(mas); fclose(f); printf("time= %d filename %s\n", GetTickCount() - t, pr->name); return 0; }