Π Π°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΡΠ΅ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Ρ ΡΠ»ΡΠΆΠ°Ρ ΠΏΡΠΈΠ½ΡΠΈΠΏΠΈΠ°Π»ΡΠ½ΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌ ΡΠ΅Π»ΡΠΌ. ΠΡΡΡΠ΅ΠΊΡ, ΠΊΠ°ΠΊ ΡΠΆΠ΅ Π±ΡΠ»ΠΎ ΡΠΊΠ°Π·Π°Π½ΠΎ ΡΠ°Π½Π΅Π΅, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π² ΠΏΠ΅ΡΠ²ΡΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π΄Π»Ρ ΡΠ΅Π³Π»Π°ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΡΠ°ΡΡΠΊΠ°ΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Π‘Π΅ΠΌΠ°ΡΠΎΡΡ ΠΆΠ΅ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Ρ Π΄Π»Ρ ΡΠ΅Π³Π»Π°ΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠΎΡΡΠ΄ΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ Π΄Π°Π½Π½ΡΡ . ΠΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ Π·Π°Π΄Π°ΡΠ°ΠΌΠΈ ΡΡΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° ΡΠ²Π»ΡΡΡΡΡ Π·Π°Π΄Π°ΡΠΈ Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ-ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΡΒ», ΠΊΠΎΠ³Π΄Π° M ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π΅ΠΉ ΡΠΎΠ·Π΄Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π΄Π°Π½Π½ΡΡ (ΡΠΈΡΠ°Ρ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ Ρ ΡΠ΅Π°Π»ΡΠ½ΡΡ Π²Π½Π΅ΡΠ½ΠΈΡ ΡΡΡΡΠΎΠΉΡΡΠ², ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ ΠΈΡ ΠΊΠ°ΠΊ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΡΠΎΠ»ΡΠΊΠΎ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ, ΠΈΠ»ΠΈ Π»ΡΠ±ΡΠΌ Π΄ΡΡΠ³ΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ), Π° N ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ Π±Π΅ΡΡΡ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½Π½ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π΄Π°Π½Π½ΡΡ Π½Π° ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ.
ΠΡΠΎ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ±ΡΠΈΠΉ ΠΈ ΡΠ°ΡΡΠΎ Π²ΡΡΡΠ΅ΡΠ°ΡΡΠΈΠΉΡΡ ΠΊΠ»Π°ΡΡ Π·Π°Π΄Π°Ρ, ΡΡΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ Β«ΡΠΊΠ΅Π»Π΅ΡΒ» Π² Π²ΠΈΠ΄Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ Π±ΡΠ΄Π΅Ρ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡ ΡΡΠ΅ΡΠ½ΡΠΉ ΡΠ΅ΠΌΠ°ΡΠΎΡ (ΡΠ°ΠΉΠ» sy22.cc). ΠΠ»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΡΠ΄Π΅Π»Π°Π½ΠΎ ΠΊΠ°ΠΊ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΊΠΎΠ΄Π° ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΉ Π³ΡΡΠΏΠΏΡ ΡΠ΅ΡΡΠΎΠ². Π ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΈΠΌΠΈΡΠ°ΡΠΈΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π° ΠΎΠ±ΡΠ΅ΠΊΡΠ° Π΄Π°Π½Π½ΡΡ , ΠΊΠ°ΠΊ ΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ Π΅Π³ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΠ°ΡΡΠΈΠ²Π½Π°Ρ ΠΏΠ°ΡΠ·Π° (delay()) Π½Π° ΡΠ»ΡΡΠ°ΠΉΠ½ΡΡ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ (ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π΄Π°Π½Π½ΡΡ Π² ΠΊΠΎΠ΄Π΅ Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΡΡΠΎ Π½Π΅ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΠΊ ΡΡΡΠ΅ΡΡΠ²Ρ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ β Π½Π°Ρ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΡΡ ΠΏΡΠΎΡΠ΅ΡΡΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, Π° Π½Π΅ ΡΠ°ΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ).
ΠΡΠΎΠΌΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π½Π°ΡΠ΅ΠΉ ΡΠ΅Π»ΠΈ ΡΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅Ρ:
β’ ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡΠΈΠ½ΡΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ (ΠΎΡΠΌΠ΅Π½Ρ) ΠΏΠΎΡΠΎΠΊΠΎΠ² Β«ΠΈΠ·Π²Π½Π΅Β» Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ Π·Π°Π²Π΅ΡΡΠ°Π΅ΠΌΠΎΡΡΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈ ΡΠ°ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΎΠΉ ΡΠΎΡΠ΅ΠΊ ΠΎΡΠΌΠ΅Π½Ρ, ΠΎ ΡΠ΅ΠΌ ΠΌΡ ΡΠΆΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠ»ΠΈ ΡΠ°Π½Π΅Π΅.
β’ ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΡ (Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΠΌΡΡ ) ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, atomic_add_value()), ΠΎ ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ Π³ΠΎΠ²ΠΎΡΠΈΡΡ ΡΡΡΡ ΠΏΠΎΠ·ΠΆΠ΅.
β’ ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠ΅Π΅Π½ΡΠ΅ΡΠ°Π±Π΅Π»ΡΠ½ΡΡ ΡΠΎΡΠΌ ΡΡΠ½ΠΊΡΠΈΠΉ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Π΅ (rand_r() Π²ΠΌΠ΅ΡΡΠΎ rand()).
ΠΠ΄ΠΈΠ½ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Ρ β T ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ#include <stdlib.h>
#include <stdio.h>
#include <iostream.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <semaphore.h>
#include <atomic.h>
const int D = 10;
unsigned int T = 2;
static sem_t sem;
pthread_t* tid;
void* writer(void* data) {
unsigned long i = (int)(data); // ΠΎΠ±ΡΠΈΠΉ ΡΠ°Π·ΠΌΠ΅Ρ Π²ΡΠ±ΠΎΡΠΊΠΈ
unsigned int s = 1;
while (i-- > 0) {
delay((long)rand_r(&s) * D / RAND_MAX + 1);
sem_post(&sem); // ΠΎΠ±ΡΠ΅ΠΊΡ Π΄Π°Π½Π½ΡΡ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½
}
for (i = 0; i < T; i++) pthread_cancel(tid[i + 1]);
return NULL;
}
static char *str; // ΡΡΡΠΎΠΊΠ° ΡΠ΅Π·ΡΠ»ΡΡΠΈΡΡΡΡΠ΅ΠΉ Π΄ΠΈΠ°Π³Π½ΠΎΡΡΠΈΠΊΠΈ
static volatile unsigned ind = 0;
void* reader(void*) {
char tid[8];
sprintf(tid, "%X", pthread_self());
unsigned int s = rand();
pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, NULL);
while(true) {
sem_wait(&sem); // ΠΏΠΎΠ»ΡΡΠ΅Π½ ΠΎΠ±ΡΠ΅ΠΊΡ Π΄Π°Π½Π½ΡΡ
str[atomic_add_value(&ind, 1)] = *tid;
pthread_testcancel();
delay((long)rand_r(&s) * D * T / RAND_MAX + 1);
}
return NULL;
}
int main(int argc, char *argv[]) {
unsigned long N = 1000;
int opt, val;
while ((opt = getopt(argc, argv, "n:t:")) != -1) {
switch(opt) {
case 'n':
if (sscanf(optarg, "%i", &val) != 1)
cout << "parse command line error" << endl, exit(EXIT_FAILURE);
if (val > 0) N = val;
break;
case 't':
if (sscanf(optarg, "%i", &val) != 1)
cout << "parse command line error" << endl, exit(EXIT_FAILURE);
if (val > 0) T = val;
break;
default:
exit(EXIT_FAILURE);
}
}
str = new char[N + 1];
tid = new pthread_t[T + 1];
if (sem_init(&sem, 0, 0))
perror("semaphore init"), exit(EXIT_FAILURE);
if (pthread_create(tid, NULL, writer, (void*)N) >= EOK)
perror("writer create error"), exit(EXIT_FAILURE);
for (int i = 0; i < T; i++)
if (pthread_create(tid + i + 1, NULL, reader, NULL) != EOK)
perror("reader create error"), exit(EXIT_FAILURE);
for (int i = 0; i < T; i++)
pthread_join(tid[i], NULL);
sem_destroy(&sem);
delete [] tid;
str[ind] = '\0';
cout << str << endl;
delete [] str;
exit(EXIT_SUCCESS);
}
ΠΠΎΡ ΠΊΠ°ΠΊ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ (Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ Π²Π½Π΅ΡΠ΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΌΠ° Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΎΠ±ΡΠ΅Π³ΠΎ ΡΠΈΡΠ»Π° ΡΠΈΠΊΠ»ΠΎΠ² Β«ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΡΡΠ²Π°Β» ΠΈ ΡΠΈΡΠ»Π° ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ Π²ΡΠ±ΡΠ°Π½Ρ Π²Π·Π°ΠΈΠΌΠ½ΠΎ ΠΏΡΠΎΡΡΡΠ΅ ΡΠΈΡΠ»Π°):
# sy22 -n200 -t13
3456789ABCDEF7936A8547E39DCB45F67A59B84D37EC64F395B6AEF78B9DF34CB53B86A5FEDF975B3A8EC46FB8AD954736FA78C3ED46F7B594EC7B83AC6F9D4BCE569A73F86BCAD74C536EB79F5C8DA5B463EFBC7D937AEC85FDE4566CAF69DE7F385CA6
Π₯ΠΎΡΠΎΡΠΎ Π²ΠΈΠ΄Π½ΠΎ, ΠΊΠ°ΠΊ ΡΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠΎΠ½Π°ΡΠ°Π»Ρ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π΄ΠΎΡΡΡΠΏΠ° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Π΅ΠΉ ΠΊ ΠΎΠ±ΡΠ΅ΠΊΡΠ°ΠΌ Π΄Π°Π½Π½ΡΡ Π΄Π΅ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΡΠ΅ΡΡΡ ΠΈ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Ρ Π°ΠΎΡΠΈΡΠ΅ΡΠΊΠΈΠΌ: ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΠ²ΡΠΈΠΉΡΡ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΏΡΠΈΡΡΡΠΏΠ°Π΅Ρ ΠΊ ΡΠ°Π±ΠΎΡΠ΅ Π½Π°Π΄ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠΌ Π΄Π°Π½Π½ΡΡ , ΠΊΠ°ΠΊ ΡΠΎΠ»ΡΠΊΠΎ ΡΠΎΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½.
ΠΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
ΠΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π΅ ΠΎΡΠ½ΠΎΡΡΡΡΡ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΡΡ Π²Π΅ΡΠ²Π΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. ΠΠΎ ΠΈΠΌ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΡΠ΄Π΅Π»ΠΈΡΡ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΏΠΎ Π΄Π²ΡΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎΠ΅ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ΅ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅Π΅ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΡΠ»ΡΡΠ°ΡΡ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠ² ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ. Π Π²ΠΎ-Π²ΡΠΎΡΡΡ , Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π°ΡΠ°ΡΡΡΡ Π²ΡΠΏΠ°Π΄Π°ΡΡ ΠΈΠ· ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π½ΠΈΡ ΠΈΠ·-Π·Π° ΠΈΡ Π΄Π²ΠΎΠΉΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΡ: ΠΏΡΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΠΈΠ·ΠΌΠ° ΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΎΠ½ΠΈ Π½Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΠΌΠΈ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ, Π° ΠΏΡΠΈ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π½Π΅ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡΡΡ ΠΏΠΎΡΠΎΠΌΡ, ΡΡΠΎ Π·Π΄Π΅ΡΡ Π² Π½ΠΈΡ ΠΏΡΠΎΡΡΠΎ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ.
ΠΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ β ΡΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅ΡΡΡ ΠΈΡ Π½Π΅ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΠΌΠΎΡΡΡ Π΄Π°ΠΆΠ΅ ΠΏΡΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π½Π° ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΡΡ ΠΌΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΡΡ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°Ρ . ΠΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π΅ ΠΏΡΠ΅ΡΡΠ²Π°Π΅ΡΡΡ Π΄Π°ΠΆΠ΅ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½ΡΠΌΠΈ Π°ΠΏΠΏΠ°ΡΠ°ΡΠ½ΡΠΌΠΈ ΠΏΡΠ΅ΡΡΠ²Π°Π½ΠΈΡΠΌΠΈ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΡΡΠ° Π³ΡΡΠΏΠΏΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠΉ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΌ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΠΈ.
ΠΠ΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡΠ°ΡΡΠΎ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡΡΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΊΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠ΅ΠΊΡΠΈΠΈ ΠΊΠΎΠ΄Π° Ρ ΡΠ΅Π»ΡΡ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ΅Π½ΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ Π²ΠΎΠ·Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π½Π° ΠΎΠ±ΡΠ΅ΠΊΡΡ Π΄Π°Π½Π½ΡΡ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ ΡΠ°Π·Π²ΠΈΠ²Π°ΡΡΠΈΡ ΡΡ Π²Π΅ΡΠ²Π΅ΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
ΠΡΠΈ ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠ°Π±ΠΎΡΠ΅ Ρ Π΄Π°Π½Π½ΡΠΌΠΈ ΠΈΠ· ΡΠ°Π·Π»ΠΈΡΠ½ΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠ»Π΅ ΡΠ°ΠΊΠΎΠ³ΠΎ Π²ΠΎΠ·Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΡΠΈΡΠ°ΡΡΡΡ Β«Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΠΌΒ», ΠΏΡΠΈ ΡΡΠΎΠΌ ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΡ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΡΠΆΠΊΠΈΠΌΠΈ, ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ Π½Π΅ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ Π΄Π°Π½Π½ΡΡ - ΡΡΡΡΠΊΡΡΡΠ° ΡΠ»ΠΎΠΆΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΡΠΎΡΡΠΎ ΡΠ°Π·ΡΡΡΠ΅Π½Π°.
Π ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Π΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°ΡΠ½ΡΠ΅ ΠΈ ΠΏΡΠΈΠ²ΡΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΌΠΎΠ³ΡΡ ΡΠ°ΠΈΡΡ Π² ΡΠ΅Π±Π΅ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ. ΠΠ΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π²ΠΈΠ΄Π°:
i = i + 1;
ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ Π² ΡΠ΅Π±Π΅ ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΡ, Π΅ΡΠ»ΠΈ ΡΡΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π·Π°ΠΏΠΈΡΠ°Π½ Π² ΡΡΠ½ΠΊΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠ°, Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠΉ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΡΠΊΠ·Π΅ΠΌΠΏΠ»ΡΡΠ°ΠΌΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ² (ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ ΡΠΈΠΏΠΈΡΠ½ΡΠΉ ΡΠ»ΡΡΠ°ΠΉ). ΠΠ΅ ΠΌΠ΅Π½Π΅Π΅ ΠΎΠΏΠ°ΡΠ΅Π½, Π½ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π΅Π½ ΠΏΠΎ Π²Π½Π΅ΡΠ½Π΅ΠΌΡ Π²ΠΈΠ΄Ρ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ:
i += 1;
ΠΠ°ΠΆΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΈΠ½ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ° ΠΈ Π΄Π΅ΠΊΡΠ΅ΠΌΠ΅Π½ΡΠ° (++i ΠΈ --i), ΠΊΠΎΡΠΎΡΡΠ΅ Π² ΡΠΈΡΡΠ΅ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π²ΡΠ΅Ρ ΡΠΈΠΏΠΎΠ² ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠΎΠ² Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΊΠ°ΠΊ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΈ ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ²Π»ΡΡΡΡΡ ΠΎΡΠ½ΠΎΠ²ΠΎΠΉ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ΅ΠΌΠ°ΡΠΎΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ, Π² ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΠΎΠΉ ΠΌΡΠ»ΡΡΠΈΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ½ΠΎΠΉ Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ΅ ΠΏΠ΅ΡΠ΅ΡΡΠ°ΡΡ Π±ΡΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌΠΈ. Π₯ΡΠΆΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΡΠΈΠ²ΡΡΠ½ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΈ ΠΏΡΠΎΡΡΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ ΡΠ·ΡΠΊΠ° ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ Π½Π΅Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΠΌΠΈ Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡΠΎΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Π΅. ΠΠΎΡ Π΅ΡΠ΅ Π΄Π²Π° ΠΏΡΠΈΠΌΠ΅ΡΠ°:
1. ΠΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π½Π΅ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π±Π»ΠΎΠΊΠ° ΠΏΠ°ΠΌΡΡΠΈ, Π±Π΅Π·Π±ΠΎΡΠ·Π½Π΅Π½Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π΄Π΅ΡΡΡΠΈΠ»Π΅ΡΠΈΡΠΌΠΈ:
void* memcpy(void* dst, const void* src, size_t length);
2. ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ, ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ»ΠΈ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ ΡΡΡΡΠΊΡΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π΄Π°Π½Π½ΡΡ :
struct X {
X(const X& y) { ... }
friend bool operator==(const X& f, const X& s) { ... }
// ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ ΠΌΡ Π½Π΅ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ
// ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ - ΠΏΠΎΠ±Π°ΠΉΡΠΎΠ²ΠΎΠ΅ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
};
...
X A;
...
X B(Π); // ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°
...
B = A; // ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°
if (Π == Π) { ... } // ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½Π°Ρ ΠΎΡΠΈΠ±ΠΊΠ°
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π²ΡΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΡ Π΄Π°Π½Π½ΡΡ , Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠ³ΡΡ Π½Π°Π±Π»ΡΠ΄Π°ΡΡΡΡ ΠΎΠ±ΡΡΠΆΠ΄Π°Π΅ΠΌΡΠ΅ ΡΡΡΠ΅ΠΊΡΡ, Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ Π΄ΠΎΡΡΡΠΏΠ½Ρ Π²Π½Π΅ ΠΏΠΎΡΠΎΠΊΠ°, ΡΠΎ Π΅ΡΡΡ Π±ΡΡΡ Π³Π»ΠΎΠ±Π°Π»ΡΠ½ΡΠΌΠΈ Ρ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ Π²ΠΈΠ΄ΠΈΠΌΠΎΡΡΠΈ Π² ΠΏΠΎΡΠΎΠΊΠ΅.
ΠΠΌΠ΅Π½Π½ΠΎ Π΄Π»Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΌΠ°Π½ΠΈΠΏΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΡ Π΄Π°Π½Π½ΡΠΌΠΈ Π² ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ΅Π΄Π΅ QNX API ΠΈ Π²Π²ΠΎΠ΄ΡΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ. ΠΠ΅ΡΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΠΉ Π΄Π΅Π»ΡΡΡΡ Π½Π° Π΄Π²Π΅ ΡΠΈΠΌΠΌΠ΅ΡΡΠΈΡΠ½ΡΠ΅ Π³ΡΡΠΏΠΏΡ ΠΏΠΎ Π²ΠΈΠ΄Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΡ ΠΈ Π»ΠΎΠ³ΠΈΠΊΠ΅ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΡΠ΅ Π°ΡΠΎΠΌΠ°ΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π°Π΄ ΠΎΠ΄Π½ΠΈΠΌ ΡΠΈΠΏΠΎΠΌ Π΄Π°Π½Π½ΡΡ unsigned int, Π½ΠΎ, ΠΊΠ°ΠΊ Π±ΡΠ΄Π΅Ρ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π΄Π°Π»Π΅Π΅, ΡΡΠΎ Π½Π΅ ΡΠ°ΠΊΠΎΠ΅ ΡΠΆ ΠΈ ΡΠΈΠ»ΡΠ½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅. Π‘Π°ΠΌ ΠΎΠ±ΡΠ΅ΠΊΡ, Π½Π°Π΄ ΠΊΠΎΡΠΎΡΡΠΌ ΠΎΡΡΡΠ΅ΡΡΠ²Π»ΡΠ΅ΡΡΡ Π°ΡΠΎΠΌΠ°ΡΠ½Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡ (ΡΠΈΠΏΠ° unsigned int), β ΡΡΠΎ ΡΠ°ΠΌΠ°Ρ ΠΎΠ±ΡΡΠ½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ ΡΠ΅Π»ΠΎΡΠΈΡΠ»Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΏΠ°, ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠΏΠΈΡΠ°Π½Π½Π°Ρ Ρ ΠΊΠ²Π°Π»ΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠΌ volatile.