int main() {
Β // ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ΅Π°ΠΊΡΠΈΠΈ ^C Π² ΡΡΠ°ΡΠΎΠΉ ΠΌΠ°Π½Π΅ΡΠ΅
Β signal(SIGINT, endhandler);
Β // ΠΌΠ°ΡΠΊΠ° Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ-ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π½ΠΈΡ
Β sigemptyset(&sig);
Β sigaddset(&sig, SIGNUM);
Β // Π±Π»ΠΎΠΊΠΈΡΠΎΠ²ΠΊΠ° Π² Π³Π»Π°Π²Π½ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ
Β sigprocmask(SIG_BLOCK, &sig, NULL);
Β cout << "Process " << getpid() << ", waiting for signal " << SIGNUM << endl;
Β // ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° (Π΄Π»Ρ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΡ
ΠΏΠΎΡΠΎΠΊΠΎΠ²)
Β struct sigaction act;
Β act.sa_mask = sig;
Β act.sa_sigaction = handler;
Β act.sa_flags = SA_SIGINFO;
Β if (sigaction(SIGNUM, &act, NULL) < 0) perror("set signal handler: ");
Β const int thrnum = 3;
Β for (int i = 0; i < thrnum; i++) {
Β threcord threc = { 0, false };
Β pthread_create(&threc.tid, NULL, threadfunc, (void*)i);
Β tharray.push_back(three);
Β }
Β pause();
Β // ΡΡΠ΄Π° ΠΌΡ ΠΏΠΎΠΏΠ°Π΄Π°Π΅ΠΌ ΠΏΠΎΡΠ»Π΅ ^C Π΄Π»Ρ Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΡ
ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ...
Β tharray.erase(tharray.begin(), tharray.end());
Β cout << "Clean vector" << endl;
}ΠΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ , ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΎ ΡΠΆΠ΅ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠΈ Π‘++, Π² Π½Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ½ΡΠΉ ΠΊΠ»Π°ΡΡ
vectorΠΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΡΡΠ΅ΠΏΠ΅Π½ΠΈ ΠΈΡΠΊΡΡΡΡΠ²Π΅Π½Π½ΠΎ ΠΈ Π½Π΅ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ. ΠΡ ΠΏΡΠΈΠ²ΠΎΠ΄ΠΈΠΌ Π΅Π³ΠΎ Π·Π΄Π΅ΡΡ Π½Π΅ ΠΊΠ°ΠΊ ΠΎΠ±ΡΠ°Π·Π΅Ρ ΡΠΎΠ³ΠΎ, Β«ΠΊΠ°ΠΊ Π½ΡΠΆΠ½ΠΎ Π΄Π΅Π»Π°ΡΡΒ», Π° ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠ°ΠΊ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΡ Π³ΠΈΠ±ΠΊΠΎΡΡΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ Π² ΠΎΠ±Π»Π°ΡΡΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΡΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΈΠ·ΠΎΠ±ΡΠ΅ΡΠ°ΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ ΡΠΎΠ³Π»Π°ΡΠ½ΠΎ Π²Π°ΡΠΈΠΌ ΠΊΠ°ΠΏΡΠΈΠ·Π°ΠΌ, ΠΊΠ°ΠΊΠΈΠΌΠΈ Π±Ρ ΠΈΠ·ΠΎΡΡΠ΅Π½Π½ΡΠΌΠΈ ΠΎΠ½ΠΈ Π½ΠΈ ΠΎΠΊΠ°Π·Π°Π»ΠΈΡΡ.
ΠΠ°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:
# s10
Process 2089006, waiting for signal 41ΠΠΎΡΠ»Π΅ ΡΠ΅Π³ΠΎ Ρ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π° ΠΏΠΎΡΠ»Π΅ΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΠΆΠΈΠ΄Π°Π΅ΠΌΡΠΉ ΠΈΠΌ ΡΠΈΠ³Π½Π°Π», Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ:
# kill -41 2089006ΠΠΎΡΡΠ»Π°Π΅ΠΌ ΡΡΠΎΡ ΡΠΈΠ³Π½Π°Π» Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· (Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ 3) ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ Π²ΡΠ²ΠΎΠ΄ ΠΎΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ:
SIG = 41; TID = 4
SIG = 41; TID = 2
SIG = 41; TID = 3
SIG = 41; TID = 3
SIG = 41; TID = 4
SIG = 41; TID = 2
SIG = 41; TID = 2
SIG = 41; TID = 3
SIG = 41; TID = 4
^C
Clean vectorΠΠΈΠ΄Π½ΠΎ, ΡΡΠΎ ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠΈΠ³Π½Π°Π» Π²ΠΎΠ·Π±ΡΠΆΠ΄Π°Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π· (ΠΏΠΎ ΡΠΈΡΠ»Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ²), ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΡΠ°Π·Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° (TID). ΠΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΎ ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΡΠ΄ΠΊΠ° Π°ΠΊΡΠΈΠ²ΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΎΡ ΡΠΈΠ³Π½Π°Π»Π° ΠΊ ΡΠΈΠ³Π½Π°Π»Ρ, ΡΠΎ Π΅ΡΡΡ ΠΏΠΎΡΠΎΠΊΠΈ Π² ΠΎΡΠ΅ΡΠ΅Π΄ΠΈ ΠΎΠΆΠΈΠ΄Π°ΡΡΠΈΡ Β«ΠΏΠ΅ΡΠ΅ΡΠ°ΡΠΎΠ²ΡΠ²Π°ΡΡΡΡΒ» ΠΏΡΠΈ ΠΏΠΎΡΡΡΠΏΠ»Π΅Π½ΠΈΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Π°.
Π ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π° ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ^C (ΡΠΈΠ³Π½Π°Π»
SIGINTβ’Β Π½Π°ΡΠΈΠ½Π°Ρ Ρ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΈΡ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²ΠΎΠ²Π°ΡΡ Π½Π΅ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ; Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΌΡ ΡΡΠ»ΠΎΠ²Π½ΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ ΠΎΡΠΈΡΡΠΊΡ Π²Π΅ΠΊΡΠΎΡΠ° ΡΠΎΡΡΠΎΡΠ½ΠΈΠΉ ΠΏΠΎΡΠΎΠΊΠΎΠ²;
β’Β ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π°
SIGINTSIGRTMINΠΠ°ΠΊ ΠΌΡ ΡΠΆΠ΅ Π²ΠΈΠ΄Π΅Π»ΠΈ, ΡΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΠΏΠΎΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ°Π·Π±Π»ΠΎΠΊΠΈΡΠΎΠ²Π°Π» ΡΠ΅Π°ΠΊΡΠΈΡ Π½Π° ΡΡΠΎΡ ΡΠΈΠ³Π½Π°Π» (Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ ΠΎΡ ΡΠΎΠ³ΠΎ, Π² ΠΌΠΎΠΌΠ΅Π½Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΡΠΈΠ³Π½Π°Π»), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π² ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ΅ ΡΠΈΠ³Π½Π°Π»Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ Π»ΡΠ±ΠΎΠΉ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ Π² ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ°Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π»ΠΈΡΡ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΡΡ Π²ΡΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ Π΄Π°Π½Π½ΡΡ , Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°Π΅ΠΌΡΠ΅ Π² ΡΡΠΎΠΉ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅, Π½Π΅ Π² ΡΡΠ΅ΠΊΠ΅ ΠΏΠΎΡΠΎΠΊΠ° (ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΠ΅ ΠΊΠ°ΠΊ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΏΠΎΡΠΎΠΊΠΎΠ²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ), Π° Π² ΠΎΠ±Π»Π°ΡΡΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΡ Π΄Π°Π½Π½ΡΡ ΠΏΠΎΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ ΡΠ°ΡΡΠΌΠΎΡΡΠ΅Π»ΠΈ ΡΠ°Π½Π΅Π΅. Π‘Ρ Π΅ΠΌΠ°ΡΠΈΡΠ½ΠΎ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ Π² ΠΊΠΎΠ΄Π΅ ΡΠ°ΠΊ:
β’Β ΠΠΎΠ»ΠΎΠΆΠΈΠΌ, Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΡΡ ΠΎ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠΎΠ±ΡΡΠΈΡΡ N ΠΏΠΎΡΠΎΠΊΠΎΠ².
ΠΡΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠΈΠ³Π½Π°Π»Ρ
SIGRTMINSIGRTMIN + (N - 1)
for (int i = SIGRTMIN, i < SIGRTMIN + N; i++) {
Β pthread_create(NULL, NULL, threadfunc, (void*)(i));
}β’Β ΠΡΠΈ Π·Π°ΠΏΡΡΠΊΠ΅
N
class DataBlock {
Β ~DataBlock(void) {...}
};
static pthread_key_t key;
static pthread_once_t once = PTHREAD_ONCE_INIT;
static void destructor(void* db) { delete (DataBlock*)db; }
static void once_creator(void) {
Β pthread_key_create(&key, destructor);
}
void* threadfunc(void* data) {
Β // Π½Π°Π΄Π»Π΅ΠΆΠ°ΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΌΠ°ΡΠΊΠΈΡΡΠ΅ΠΌ ΡΠΈΠ³Π½Π°Π»Ρ
Β // ...
Β // ΡΡΠΎ ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΏΠΎΡΠΎΠΊΠ΅ ΠΈΠ· N