ΠΠ΄Π΅ΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π° ΠΌΠ°ΡΡΠ° ΠΏΡΠΎΠ±Π»Π΅ΠΌ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎΡΠΎΠΊ Π ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΏΡΡΠ°ΡΡΡΡ Π²ΡΠ΄Π΅Π»ΠΈΡΡ ΠΈΠΌΡ ΡΠ°ΠΉΠ»Π° ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° 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;