ΠΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π·Π°ΡΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ stopped ΠΊΠ»Π°ΡΡΠ° Thread ΠΈΠ· ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΡΠ°Π·Π΄Π΅Π»Π° Ρ ΠΏΠΎΠΌΠΎΡΡΡ QMutex. Π’ΠΎΠ³Π΄Π° ΠΌΡ Π±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΊ ΠΊΠ»Π°ΡΡΡ Thread ΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡβΡΠ»Π΅Π½:
private:
QMutex mutex;
β¦
};
Π€ΡΠ½ΠΊΡΠΈΡ run() ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»Π°ΡΡ Π±Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
01 void Thread::run()
02 {
03 forever {
04 mutex.lock();
05 if (stopped) {
06 stopped = false;
07 mutex.unlock();
08 break;
09 }
10 mutex.unlock();
11 cerr << qPrintable(messageStr.ascii);
12 }
13 cerr << endl;
14 }
Π€ΡΠ½ΠΊΡΠΈΡ stop() ΡΡΠ°Π»Π° Π±Ρ ΡΠ°ΠΊΠΎΠΉ:
01 void Thread::stop()
02 {
03 mutex.lock();
04 stopped = true;
05 mutex.unlock();
06 }
ΠΠ»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΈ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° ΠΌΡΡΡΠ΅ΠΊΡΠ° Π² ΡΠ»ΠΎΠΆΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡΡ ΠΈΠ»ΠΈ ΡΠ°ΠΌ, Π³Π΄Π΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡΡΡ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡ Π‘++, ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΎΡΠΈΠ±ΠΊΠΈ. Qt ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΡΠ΄ΠΎΠ±Π½ΡΠΉ ΠΊΠ»Π°ΡΡ QMutexLocker, ΡΠΏΡΠΎΡΠ°ΡΡΠΈΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ². ΠΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ QMutexLocker ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ° ΠΎΠ±ΡΠ΅ΠΊΡ QMutex ΠΈ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ Π΅Π³ΠΎ. ΠΠ΅ΡΡΡΡΠΊΡΠΎΡ QMutexLocker ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΠΌΡΡΡΠ΅ΠΊΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΡΠ΅ Π²ΡΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ run() ΠΈ stop() ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΠ°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
01 void Thread::run()
02 {
03 forever {
04 {
05 QMutexLocker locker(&mutex);
06 if (stopped) {
07 stopped = false;
08 break;
09 }
10 }
11 cerr << qPrintable(messageStr);
12 }
13 cerr << endl;
14 }
15 void Thread::stop()
16 {
17 QMutexLocker locker(&mutex);
18 stopped = true;
18 }
ΠΠ΄Π½Π° ΠΈΠ· ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΌΡΡΡΠ΅ΠΊΡΠΎΠ² Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΈΠ·-Π·Π° Π΄ΠΎΡΡΡΠΏΠ½ΠΎΡΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. Π ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ ΡΠΎ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠ°ΠΌΠΈ, ΠΏΡΡΠ°ΡΡΠΈΠΌΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠΈΡΠ°ΡΡ ΠΎΠ΄Π½Ρ ΠΈ ΡΡ ΠΆΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ (Π½Π΅ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΡ Π΅Π΅), ΠΌΡΡΡΠ΅ΠΊΡ ΠΌΠΎΠΆΠ΅Ρ ΡΠ΅ΡΡΠ΅Π·Π½ΠΎ ΡΠ½ΠΈΠΆΠ°ΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡ. Π ΡΡΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ QReadWriteLock β ΠΊΠ»Π°ΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ, Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡΠΈΠΉ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠΉ Π΄ΠΎΡΡΡΠΏ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ Π±Π΅Π· ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ.
Π ΠΊΠ»Π°ΡΡΠ΅ Thread Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ»Π° Π·Π°ΠΌΠ΅Π½ΡΡΡ ΠΌΡΡΡΠ΅ΠΊΡ QMutex Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΎΠΉ QReadWriteLock Π΄Π»Ρ Π·Π°ΡΠΈΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ stopped, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π² Π»ΡΡΡΠ΅ΠΌ ΡΠ»ΡΡΠ°Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΡΠ°ΡΡΡΡ ΡΠΈΡΠ°ΡΡ ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² Π»ΡΠ±ΠΎΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΠΉ ΠΏΡΠΈΠΌΠ΅Ρ ΠΌΠΎΠ³ Π±Ρ ΡΠΎΡΡΠΎΡΡΡ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΡΠΈΡΡΠ²Π°ΡΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΏΠΎΠ»ΡΡΠ°ΡΡΠΈΡ Π΄ΠΎΡΡΡΠΏ ΠΊ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΌ Π΄Π°Π½Π½ΡΠΌ, ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ Π·Π°ΠΏΠΈΡΡΠ²Π°ΡΡΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΡΡΡΠΈΡ Π΄Π°Π½Π½ΡΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
01 MyData data;
02 QReadWriteLock lock;
03 void ReaderThread::run()
04 {
05 β¦
06 lock.lockForRead();
07 access_data_without_modifying_it(&data);
08 lock.unlock();
09 β¦
10 }
11 void WriterThread::run()
12 {
13 β¦
14 lock.lockForWrite();
15 modify_data(&data);
16 lock.unlock();
17 β¦
18 }
Π Π°Π΄ΠΈ ΡΠ΄ΠΎΠ±ΡΡΠ²Π° ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠ»Π°ΡΡΡ QReadLocker ΠΈ QWriteLocker Π΄Π»Ρ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΈ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠΈ ΠΎΠ±ΡΠ΅ΠΊΡΠ° QReadWriteLock.
ΠΠ»Π°ΡΡ QSemaphore β ΡΡΠΎ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎ ΠΎΠ±ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΌΡΡΡΠ΅ΠΊΡΠ°, Π½ΠΎ, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΎΠΊ ΡΡΠ΅Π½ΠΈΡ/Π·Π°ΠΏΠΈΡΠΈ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ Π΄Π»Ρ ΠΊΠΎΠ½ΡΡΠΎΠ»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΡΡ ΡΠ΅ΡΡΡΡΠΎΠ². Π‘Π»Π΅Π΄ΡΡΡΠΈΠ΅ Π΄Π²Π° ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρ QSemaphore ΠΈ QMutex:
β’ QSemaphore semaphore(1) β QMutex mutex,
β’ Semaphore.acquire() β mutex.lock(),
β’ Semaphore.release() β mutex.unlock().
ΠΠ΅ΡΠ΅Π΄Π°Π²Π°Ρ 1 ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ, ΠΌΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΡΠ΅ΠΌΠ°ΡΠΎΡΡ Π½Π° ΡΠΎ, ΡΡΠΎ ΠΎΠ½ ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ°Π±ΠΎΡΠΎΠΉ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ΅ΡΡΡΡΠ°. ΠΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ° Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡΡ ΡΠΈΡΠ»Π°, ΠΎΡΠ»ΠΈΡΠ½ΡΠ΅ ΠΎΡ 1, ΠΈ Π·Π°ΡΠ΅ΠΌ Π²ΡΠ·ΡΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ acquire() Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· Π΄Π»Ρ Π·Π°Ρ Π²Π°ΡΠ° ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ΅ΡΡΡΡΠΎΠ².
Π’ΠΈΠΏΠΈΡΠ½Π°Ρ ΠΎΠ±Π»Π°ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ² β ΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ³ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²Π° Π΄Π°Π½Π½ΡΡ (DataSize) ΠΏΡΠΈ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΡΠΈΠΊΠ»ΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ° ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ° (BufferSize):
const int DataSize = 100000;
const int BufferSize = 4096;
char buffer[BufferSize];
ΠΠΎΡΠΎΠΊ, ΡΠ²Π»ΡΡΡΠΈΠΉΡΡ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠΎΠΌ Π΄Π°Π½Π½ΡΡ , Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² Π±ΡΡΠ΅Ρ, ΠΏΠΎΠΊΠ° ΠΎΠ½ Π½Π΅ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡΡ, ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΠ²ΡΠΎΡΡΠ΅Ρ ΡΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΡΠ½Π°ΡΠ°Π»Π°, ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°Ρ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ Π΄Π°Π½Π½ΡΠ΅. ΠΠΎΡΠΎΠΊ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠΈΠΉ Π΄Π°Π½Π½ΡΠ΅, ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΠΈΡ ΠΏΠΎΡΡΡΠΏΠ»Π΅Π½ΠΈΡ. ΠΡΠΎ ΠΏΡΠΎΠΈΠ»Π»ΡΡΡΡΠΈΡΠΎΠ²Π°Π½ΠΎ Π½Π° ΡΠΈΡ. 18.2 Π΄Π»Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ 16-Π±Π°ΠΉΡΠΎΠ²ΠΎΠ³ΠΎ Π±ΡΡΠ΅ΡΠ°.
Π ΠΈΡ. 18.2. ΠΠΎΠ΄Π΅Π»Ρ Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ Π΄Π²ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ²: ΡΠΎΡΠΌΠΈΡΡΡΡΠ΅Π³ΠΎ ΠΈ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΠ΅Π³ΠΎ Π΄Π°Π½Π½ΡΠ΅.
ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π»Ρ ΠΏΡΠΈΠΌΠ΅ΡΠ° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠ², ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΡΠΌΠΈΡΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅, Π° Π΄ΡΡΠ³ΠΎΠΉ ΠΈΡ ΡΡΠΈΡΡΠ²Π°Π΅Ρ, ΠΎΠ±ΡΡΠ»ΠΎΠ²Π»Π΅Π½Π° Π΄Π²ΡΠΌΡ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌΠΈ: Π΅ΡΠ»ΠΈ ΡΠΎΡΠΌΠΈΡΡΡΡΠΈΠΉ Π΄Π°Π½Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΡΡΡΡΠΎ, ΠΎΠ½ ΡΡΠ°Π½Π΅Ρ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅, ΠΊΠΎΡΠΎΡΡΠ΅ Π΅ΡΠ΅ Π½Π΅ ΡΡΠΈΡΠ°Π» ΠΏΠΎΡΠΎΠΊβΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ; Π΅ΡΠ»ΠΈ ΠΏΠΎΡΠΎΠΊβΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ ΡΡΠΈΡΡΠ²Π°Π΅Ρ Π΄Π°Π½Π½ΡΠ΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ Π±ΡΡΡΡΠΎ, ΠΎΠ½ ΠΏΠ΅ΡΠ΅Π³ΠΎΠ½ΠΈΡ Π΄ΡΡΠ³ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΠΈ ΡΡΠ°Π½Π΅Ρ ΡΡΠΈΡΡΠ²Π°ΡΡ Β«ΠΌΡΡΠΎΡΒ».
ΠΡΡΠ±ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΡΠ½Π°ΡΠ°Π»Π° Π·Π°ΠΏΠΎΠ»Π½ΠΈΡΡ Π±ΡΡΠ΅Ρ ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΆΠ΄Π°ΡΡ, ΠΏΠΎΠΊΠ° ΠΏΠΎΡΠΎΠΊβΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ Π½Π΅ ΡΡΠΈΡΠ°Π΅Ρ Π±ΡΡΠ΅Ρ ΡΠ΅Π»ΠΈΠΊΠΎΠΌ ΠΈ ΡΠ°ΠΊ Π΄Π°Π»Π΅Π΅. ΠΠ΄Π½Π°ΠΊΠΎ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΡΡ ΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΡΡΠΎ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΎΠ±ΠΎΠΈΠΌ ΠΏΠΎΡΠΎΠΊΠ°ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Ρ ΡΠ°Π·Π½ΡΠΌΠΈ ΡΠ°ΡΡΡΠΌΠΈ Π±ΡΡΠ΅ΡΠ°.
ΠΠ΄Π½ΠΈ ΠΈΠ· ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΡ ΡΠΏΠΎΡΠΎΠ±ΠΎΠ² ΡΠ΅ΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ Π΄Π²ΡΡ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ²:
QSemaphore freeSpace(BufferSize);
QSemaphore usedSpace(0);
Π‘Π΅ΠΌΠ°ΡΠΎΡ freeSpace ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠΉ ΡΠ°ΡΡΡΡ Π±ΡΡΠ΅ΡΠ°, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΌΠΎΠΆΠ΅Ρ Π·Π°ΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, ΡΠΎΡΠΌΠΈΡΡΡΡΠΈΠΌ Π΄Π°Π½Π½ΡΠ΅. Π‘Π΅ΠΌΠ°ΡΠΎΡ usedSpace ΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠΉ ΠΎΠ±Π»Π°ΡΡΡΡ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΡΡΠΈΡΡΠ²Π°ΡΡ ΠΏΠΎΡΠΎΠΊβΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ. ΠΡΠΈ Π΄Π²Π΅ ΠΎΠ±Π»Π°ΡΡΠΈ Π²Π·Π°ΠΈΠΌΠ½ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π°. Π‘Π΅ΠΌΠ°ΡΠΎΡ freeSpace ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ Π½Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ BufferSize (4096), ΡΠΎ Π΅ΡΡΡ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π·Π°Ρ Π²Π°ΡΡΠ²Π°ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ ΡΠ°ΠΊΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΡΡΡΡΠΎΠ². ΠΠΎΠ³Π΄Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΡΡΡ, ΠΏΠΎΡΠΎΠΊ, ΡΡΠΈΡΡΠ²Π°ΡΡΠΈΠΉ Π΄Π°Π½Π½ΡΠ΅, Π½Π°ΡΠΈΠ½Π°Π΅Ρ Π·Π°Ρ Π²Π°ΡΡΠ²Π°ΡΡ Β«ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠ΅Β» Π±Π°ΠΉΡΡ ΠΈ ΠΏΡΠ΅Π²ΡΠ°ΡΠ°ΡΡ ΠΈΡ Π² Β«ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅Β» Π±Π°ΠΉΡΡ. Π‘Π΅ΠΌΠ°ΡΠΎΡ usedSpace ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ Π½ΡΠ»Π΅Π²ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΠΎΠΊβΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ Π½Π΅ ΠΌΠΎΠ³ ΡΡΠΈΡΠ°ΡΡ Β«ΠΌΡΡΠΎΡΒ» ΠΏΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
Π ΡΡΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π±Π°ΠΉΡ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ ΡΠ΅ΡΡΡΡ. Π ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΌΡ, Π²Π΅ΡΠΎΡΡΠ½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π±Ρ Π±ΠΎΠ»Π΅Π΅ ΠΊΡΡΠΏΠ½ΡΠ΅ Π±Π»ΠΎΠΊΠΈ ΠΏΠ°ΠΌΡΡΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΠΎ 64 ΠΈΠ»ΠΈ 256 Π±Π°ΠΉΡ) Π΄Π»Ρ ΡΠ½ΠΈΠΆΠ΅Π½ΠΈΡ Π·Π°ΡΡΠ°Ρ, ΠΎΠ±ΡΡΠ»ΠΎΠ²Π»Π΅Π½Π½ΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΡΠ΅ΠΌΠ°ΡΠΎΡΠΎΠ².
01 void Producer::run()
02 {
03 for (int i = 0; i < DataSize; ++i) {
04 freeSpace.acquire();
05 buffer[i % BufferSize] = "ACGT"[uint(rand()) % 4];
06 usedSpace.release();
07 }
08 }
ΠΠ°ΠΆΠ΄Π°Ρ ΠΈΡΠ΅ΡΠ°ΡΠΈΡ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ ΠΏΠΎΡΠΎΠΊΠ°, ΡΠΎΡΠΌΠΈΡΡΡΡΠ΅Π³ΠΎ Π΄Π°Π½Π½ΡΠ΅, Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ Π·Π°Ρ Π²Π°ΡΠ° ΠΎΠ΄Π½ΠΎΠ³ΠΎ Β«ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ³ΠΎΒ» Π±Π°ΠΉΡΠ°. ΠΡΠ»ΠΈ Π²Π΅ΡΡ Π±ΡΡΠ΅Ρ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ Π΄Π°Π½Π½ΡΠΌΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΡΡΠΈΡΠ°Π½Ρ ΠΏΠΎΡΠΎΠΊΠΎΠΌβΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠΌ, Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ acquire() Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΏΠΎΡΠΎΠΊβΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ Π½Π΅ Π½Π°ΡΠ½Π΅Ρ ΡΡΠΈΡΡΠ²Π°ΡΡ Π΄Π°Π½Π½ΡΠ΅. ΠΠ°Ρ Π²Π°ΡΠΈΠ² Π±Π°ΠΉΡ, ΠΌΡ Π·Π°ΠΏΠΎΠ»Π½ΡΠ΅ΠΌ Π΅Π³ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΠΌ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ (Β«ΠΒ», Β«Π‘Β», Β«GΒ» ΠΈΠ»ΠΈ Β«TΒ») ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΠΌ Π±Π°ΠΉΡ ΠΈ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅ΠΌ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Β«ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΡΠΉΒ», ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΡΠΊΠ°Π·ΡΠ²Π°Ρ Π½Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π΅Π³ΠΎ ΡΡΠΈΡΡΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΎΠΌβΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊΠΎΠΌ.
01 void Consumer::run()
02 {
03 for (int i = 0; i < DataSize; ++i) {
04 usedSpace.acquire();
05 cerr << buffer[i % BufferSize];
06 freeSpace.release();
07 }
08 cerr << endl;
09 }
Π Π°Π±ΠΎΡΡ ΠΏΠΎΡΠΎΠΊΠ°βΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊΠ° ΠΌΡ Π½Π°ΡΠΈΠ½Π°Π΅ΠΌ Ρ Π·Π°Ρ Π²Π°ΡΠ° ΠΎΠ΄Π½ΠΎΠ³ΠΎ Β«ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎΒ» Π±Π°ΠΉΡΠ°. ΠΡΠ»ΠΈ Π±ΡΡΠ΅Ρ Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π΄Π°Π½Π½ΡΡ Π΄Π»Ρ ΡΡΠ΅Π½ΠΈΡ, Π²ΡΠ·ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΈ acquire() Π·Π°Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΡΠ΅ΠΌΠ°ΡΠΎΡ Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΏΠ΅ΡΠ²ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π½Π΅ ΡΡΠΎΡΠΌΠΈΡΡΠ΅Ρ ΠΊΠ°ΠΊΠΈΠ΅-ΡΠΎ Π΄Π°Π½Π½ΡΠ΅. ΠΠΎΡΠ»Π΅ Π·Π°Ρ Π²Π°ΡΠ° Π½Π°ΠΌΠΈ Π±Π°ΠΉΡΠ° ΠΌΡ Π²ΡΠ²ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ Π½Π° ΡΠΊΡΠ°Π½ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π΅ΠΌ Π±Π°ΠΉΡ, ΠΏΠΎΠΌΠ΅ΡΠ°Ρ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Β«ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡΠΉΒ», ΡΠ΅ΠΌ ΡΠ°ΠΌΡΠΌ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡ ΠΏΠ΅ΡΠ²ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ Π²Π½ΠΎΠ²Ρ ΠΏΡΠΈΡΠ²ΠΎΠΈΡΡ Π΅ΠΌΡ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅.
01 int main()
02 {
03 Producer producer;
04 Consumer consumer;
05 producer.start();
06 consumer.start();
07 producer.wait();
08 consumer.wait();
09 return 0;
10 }
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π² ΡΡΠ½ΠΊΡΠΈΠΈ main() ΠΌΡ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΎΠ±Π° ΠΏΠΎΡΠΎΠΊΠ°. ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅: ΠΏΠΎΡΠΎΠΊ, ΡΠΎΡΠΌΠΈΡΡΡΡΠΈΠΉ Π΄Π°Π½Π½ΡΠ΅, ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Β«ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ΅Β» ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ Π² Β«ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ΅Β», ΠΏΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ ΠΏΠΎΡΠΎΠΊβΠΏΡΠΈΠ΅ΠΌΠ½ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ΅ ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Β«ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎΠ΅Β» ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ.
ΠΠΎΠ³Π΄Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ, ΠΎΠ½Π° Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈΠ· 100 000 Π±ΡΠΊΠ² Β«ΠΒ», Β«Π‘Β», Β«GΒ» ΠΈ Β«TΒ» ΠΈ Π·Π°ΡΠ΅ΠΌ Π·Π°Π²Π΅ΡΡΠ°Π΅Ρ ΡΠ²ΠΎΡ ΡΠ°Π±ΠΎΡΡ. ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΏΠΎΠ½ΡΡΡ, ΡΡΠΎ ΠΏΡΠΎΠΈΡΡ ΠΎΠ΄ΠΈΡ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΡΠΊΠ»ΡΡΠΈΡΡ Π²ΡΠ²ΠΎΠ΄ ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π²ΡΠ²ΠΎΠ΄ΠΈΡΡ Π½Π° ΠΊΠΎΠ½ΡΠΎΠ»Ρ Π±ΡΠΊΠ²Ρ Β«PΒ» ΠΏΡΠΈ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±Π°ΠΉΡΠ° ΠΏΠ΅ΡΠ²ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ ΠΈ Π±ΡΠΊΠ²Ρ Β«ΡΒ» ΠΏΡΠΈ ΡΡΠ΅Π½ΠΈΠΈ Π±Π°ΠΉΡΠ° Π²ΡΠΎΡΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ. Π ΡΠ°Π΄ΠΈ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΡ ΡΠΈΡΡΠ°ΡΠΈΠΈ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ΅Π½ΡΡΠΈΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² DataSize ΠΈ BufferSize.