Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠŸΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΈ распрСдСлСнноС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π° Π‘++Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 47

Автор Π₯ьюз ΠšΠ°ΠΌΠ΅Ρ€ΠΎΠ½

Π—Π΄Π΅ΡΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° масса ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. НапримСр, ΠΏΠΎΡ‚ΠΎΠΊ Π’ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ имя Ρ„Π°ΠΉΠ»Π° ΠΈΠ· списка TextFiles Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ А Π΅Π³ΠΎ Ρ‚ΡƒΠ΄Π° помСстит. ΠŸΠΎΡ‚ΠΎΠΊ Π’ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π΄Π΅ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ SearchCount Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ А Π΅Ρ‘ ΠΈΠ½ΠΊΡ€Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΈΠ»ΠΈ ΠΆΠ΅ ΠΎΠ±Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Π²ΠΎ врСмя сортировки элСмСнтов списка TextFiles ΠΏΠΎΡ‚ΠΎΠΊ А ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Π½Π΅Π³ΠΎ имя Ρ„Π°ΠΉΠ»Π°, ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ Π’ Π±ΡƒΠ΄Π΅Ρ‚ Π² это врСмя ΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈΠ· Π½Π΅Π³ΠΎ имя Ρ„Π°ΠΉΠ»Π° для выполнСния своСй Π·Π°Π΄Π°Ρ‡ΠΈ. ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ проблСмы—это ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ условий Β«Π³ΠΎΠ½ΠΎΠΊΒ», ΠΏΡ€ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… нСсколько ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² (ΠΈΠ»ΠΈ процСссов) ΠΏΡ‹Ρ‚Π°ΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π±Π»ΠΎΠΊ ΠΎΠ±Ρ‰Π΅ΠΉ памяти.

Если ΠΏΠΎΡ‚ΠΎΠΊΠΈ ΠΈΠ»ΠΈ процСссы ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ лишь Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π±Π»ΠΎΠΊ памяти, условия Β«Π³ΠΎΠ½ΠΎΠΊΒ» Π½Π΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚. Они Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ Π² случаС, ΠΊΠΎΠ³Π΄Π° нСсколько процСссов ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ доступ ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ Π±Π»ΠΎΠΊΡƒ памяти, ΠΈ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· этих процСссов ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅. Π Π°Π·Π΄Π΅Π» ΠΊΠΎΠ΄Π° становится критичСским, ΠΊΠΎΠ³Π΄Π° ΠΎΠ½ Π΄Π΅Π»Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π±Π»ΠΎΠΊ памяти. Один ΠΈΠ· способов Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ ΠΊ ритичСский Ρ€Π°Π·Π΄Π΅Π» β€” Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠΎΠ½ΠΎΠΏΠΎΠ»ΡŒΠ½Ρ‹ΠΉ доступ ΠΊ Π±Π»ΠΎΠΊΡƒ памяти. ΠœΠΎΠ½ΠΎΠΏΠΎΠ»ΡŒΠ½Ρ‹ΠΉ доступ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΊ раздСляСмому Π±Π»ΠΎΠΊΡƒ памяти Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΎΠ΄ΠΈΠ½ процСсс ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠΈ ΠΊΠΎΡ€ΠΎΡ‚ΠΊΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΊΠ° Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΡ€ΠΈ этом всСм ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ процСссам ΠΈΠ»ΠΈ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½ΠΎ (ΠΏΡƒΡ‚Π΅ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ) Π²Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π² свои критичСскиС Ρ€Π°Π·Π΄Π΅Π»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‚ доступ ΠΊ Ρ‚ΠΎΠΌΡƒ ΠΆΠ΅ самому Π±Π»ΠΎΠΊΡƒ памяти.

Для управлСния условиями Β«Π³ΠΎΠ½ΠΎΠΊΒ» ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ, ΠΊΠ°ΠΊ Π²Π·Π°ΠΈΠΌΠΎ - ΠΈΡΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉ сСмафор , ΠΈΠ»ΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ (mutexβ€” сокращСниС ΠΎΡ‚ Β«mutual exclusionΒ», - Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅). ΠœΡŒΡŽΡ‚Π΅ΠΊΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для блокирования критичСского Ρ€Π°Π·Π΄Π΅Π»Π°: ΠΎΠ½ блокируСтся Π΄ΠΎ Π²Ρ…ΠΎΠ΄Π° Π² критичСский Ρ€Π°Π·Π΄Π΅Π», Π° ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· Π½Π΅Π³ΠΎ - дСблокируСтся:

Π‘Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

// Π’Ρ…ΠΎΠ΄ Π² критичСский Ρ€Π°Π·Π΄Π΅Π».

// Доступ ΠΊ раздСляСмой ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ памяти.

// Π’Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· критичСского Ρ€Π°Π·Π΄Π΅Π»Π°.

Π”Π΅Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ°

Класс pthread_mutex_t позволяСт ΡΠΌΠΎΠ΄Π΅Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠŸΡ€Π΅ΠΆΠ΄Π΅, Ρ‡Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° pthread_mutex_t ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π΅Π³ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция pthread_mutex_init(). Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΌΡŒΡŽΡ‚Π΅ΠΊΡ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π΅Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ pthread_mutex_lock(), pthread_mutex_unlock () ΠΈ pthread_mutex_destroy () соотвСтствСнно. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 4.5 содСрТится функция, которая выполняСт поиск тСкстовых Ρ„Π°ΠΉΠ»ΠΎΠ², Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 4.6 β€” функция, которая просматриваСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ тСкстовый Ρ„Π°ΠΉΠ» Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ содСрТания Π² Π½Π΅ΠΌ Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов. КаТдая функция выполняСтся ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ. Основной ΠΏΠΎΡ‚ΠΎΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ 4.7. Π­Ρ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‚ модСль Β«ΠΈΠ·Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒ-ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΒ» для дСлСгирования Π·Π°Π΄Π°Ρ‡ ΠΏΠΎΡ‚ΠΎΠΊΠ°ΠΌ. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°4.5 содСрТит ΠΏΠΎΡ‚ΠΎΠΊ-Β«ΠΈΠ·Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒΒ», Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 4.6 β€” ΠΏΠΎΡ‚ΠΎΠΊ-Β«ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΒ». ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»Ρ‹ Π²Ρ‹Π΄Π΅Π»Π΅Π½Ρ‹ Π² Π½ΠΈΡ… ΠΏΠΎΠ»ΡƒΠΆΠΈΡ€Π½Ρ‹ΠΌ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠΌ.

// ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 4.5

1 int isDirectory(string FileName)

2 {

3 struct stat StatBuffer;

4

5 lstat(FileName.c_str(),&StatBuffer);

6 if((StatBuffer.st_mode & S_IFDIR) == -1)

7 {

8 cout << Β«could not get stats on fileΒ» << endl;

9 return(0);

10 }

11 else{

12 if(StatBuffer.st_mode & S_IFDIR){

13 return(1);

14 }

15 }

16 return(0);

17 }

18

19

20 int isRegular(string FileName)

21 {

22 struct stat StatBuffer;

23

24 lstat(FileName.c_str(),&StatBuffer);

25 if((StatBuffer.st_mode & S_IFDIR) == -1)

26 {

27 cout << Β«could not get stats on fileΒ» << endl;

28 return(0);

29 }

30 else{

31 if(StatBuffer.st_mode & S_IFREG){

32 return(1);

33 }

34 }

35 return(0);

36 }

37

38

39 void depthFirstTraversal(const char *CurrentDir)

40 {

41 DIR *DirP;

42 string Temp;

43 string FileName;

44 struct dirent *EntryP;

45 chdir(CurrentDir);

46 cout << Β«Searching Directory: " << CurrentDir << endl;

47 DirP = opendir(CurrentDir);

48

49 if(DirP == NULL){

50 cout << Β«could not open fileΒ» << endl;

51 return;

52 }

53 EntryP = readdir(DirP);

54 while(EntryP != NULL)

55 {

56 Temp.erase();

57 FileName.erase();

58 Temp = EntryP->d_name;

59 if((Temp != ".Β») && (Temp != "..Β»)){

60 FileName.assign(CurrentDir);

61 FileName.append(1,'/');

62 FileName.append(EntryP->d_name);

63 if(isDirectory(FileName)){

64 string NewDirectory;

65 NewDirectory = FileName;

66 depthFirstTraversal(NewDirectory.c_str());

67 }

68 else{

69 if(isRegular(FileName)){

70 int Flag;

71 Flag = FileName.find(".cppΒ»);

72 if(Flag > 0){

73 pthread_mutex_lock(&CountMutex);

74 FileCount++;

75 pthread_mutex_unlock(&CountMutex);

76 pthread_mutex_lock(&QueueMutex);

77 TextFiles.push(FileName);

78 pthread_mutex_unlock(&QueueMutex);

79 }

80 }

81 }

82

83 }

84 EntryP = readdir(DirP);

85 }

86 closedir(DirP);

87 }

88

89

90

91 void *task(void *X)

92 {

93 char *Directory;

94 Directory = static_cast<char *>(X);

95 depthFirstTraversal(Directory);

96 return(NULL);

97

98 }

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 4.6 содСрТит ΠΏΠΎΡ‚ΠΎΠΊ-Β«ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΒ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСт Π½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов.

// ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 4.6

1 void *keySearch(void *X)

2 {

3 string Temp, Filename;

4 less<string> Comp;

5

6 while(!Keyfile.eof() && Keyfile.good())

7 {

8 Keyfile >> Temp;

9 if(!Keyfile.eof()){

10 KeyWords.insert(Temp);

11 }

12 }

13 Keyfile.close();

14

15 while(TextFiles.empty())

16 { }

17

18 while(!TextFiles.empty())

19 {

20 pthread_mutex_lock(&QueueMutex);

21 Filename = TextFiles.front();

22 TextFiles.pop();

23 pthread_mutex_unlock(&QueueMutex);

24 Infile.open(Filename.c_str());

25 SearchWords.erase(SearchWords.begin(),SearchWords.end());

26

27 while(!Infile.eof() && Infile.good())

28 {

29 Infile >> Temp;

30 SearchWords.insert(Temp);

31 }

32

33 Infile.close();

34 if(includes(SearchWords.begin(),SearchWords.end(),

KeyWords.begin(),KeyWords.end(),Comp)){

35 Outfile << Filename << endl;

36 pthread_mutex_lock(&CountMutex);

37 FileCount--;

38 pthread_mutex_unlock(&CountMutex);

39 FoundCount++;

40 }

41 }

42 return(NULL);

43

44 }

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 4.7 содСрТит основной ΠΏΠΎΡ‚ΠΎΠΊ для ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΌΠΎΠ΄Π΅Π»ΠΈ Β«ΠΈΠ·Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅Π»ΡŒ-ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΒ», Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… 4.5 ΠΈ 4.6.

// ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° 4.7

1 #include <sys/stat.h>

2 #include <fstream>

3 #include <queue>

4 #include <algorithm>

5 #include <pthread.h>

6 #include <iostream>

7 #include <set>

8

9 pthread_mutex_t QueueMutex = PTHREAD_MUTEX_INITIALIZER;

10 pthread_mutex_t CountMutex = PTHREAD_MUTEX_INITIALIZER;

11

12 int FileCount = 0;

13 int FoundCount = 0;

14

15 int keySearch(void);

16 queue<string> TextFiles;

17 set <string,less<string> >KeyWords;

18 set <string,less<string> >SearchWords;

19 ifstream Infile;

20 ofstream Outfile;

21 ifstream Keyfile;