Π ΠΏΡΠΈΠΌΠ΅ΡΠ΅ Ρ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΡΠΌ ΠΈΠ»ΠΈ ΠΎΠ±ΠΎΡΠΎΠ±Π»Π΅Π½Π½ΡΠΌ ΠΏΠΎΡΠΎΠΊΠΎΠΌ thread5.c Π²Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ Π°ΡΡΠΈΠ±ΡΡ ΠΏΠΎΡΠΎΠΊΠ°, Π·Π°Π΄Π°Π΅ΡΠ΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ° ΠΊΠ°ΠΊ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠ΅ ΠΈ Π·Π°ΡΠ΅ΠΌ ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠ³ΠΎ Π°ΡΡΠΈΠ±ΡΡΠ° ΠΏΠΎΡΠΎΠΊ. Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° Π·Π°ΠΊΠΎΠ½ΡΠΈΡΡΡ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΠΎΡΠΎΠΊ, ΠΎΠ½ Π²ΡΠ·ΠΎΠ²Π΅Ρ ΠΎΠ±ΡΡΠ½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ pthread_exit. Π ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΏΠΎΡΠΎΠΊ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ ΠΆΠ΄Π΅Ρ ΡΠΎΠ·Π΄Π°Π½Π½ΡΠΉ ΠΈΠΌ ΠΏΠΎΡΠΎΠΊ Π΄Π»Ρ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ. Π Π΄Π°Π½Π½ΠΎΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΏΡΠΎΡΡΠΎΠΉ ΡΠ»Π°Π³ thread_finished, ΡΡΠΎΠ±Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΠΏΠΎΡΠΎΠΊΡ main ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ, Π·Π°ΠΊΠΎΠ½ΡΠΈΠ»ΡΡ Π»ΠΈ Π΄ΠΎΡΠ΅ΡΠ½ΠΈΠΉ ΠΏΠΎΡΠΎΠΊ, ΠΈ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ, ΡΡΠΎ ΠΏΠΎΡΠΎΠΊΠΈ Π²ΡΠ΅ Π΅ΡΠ΅ ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅.
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
void *thread_function(void *arg);
char message[] = "Hello World";
int thread_finished = 0;
int main() {
int res;
pthread_t a_thread;
pthread_attr_t thread_attr;
res = pthread_attr_init(&thread_attr);
if (res != 0) {
perror("Attribute creation failed");
exit(EXIT_FAILURE);
}
res = pthread_attr_setdetachstate(&thread_attr,
PTHREAD_CREATE_DETACHED);
if (res != 0) {
perror("Setting detached attribute failed");
exit(EXIT_FAILURE);
}
res = pthread_create(&a_thread, &thread_attr,
thread_function, (void *)message);
if (res != 0) {
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
(void)pthread_attr_destroy(&thread_attr);
while (!thread_finished) {
printf("Waiting for thread to say it's finished...\n");
sleep(1);
}
printf("Other thread finished, bye!\n");
exit(EXIT_SUCCESS);
}
void *thread_function(void *arg) {
printf("thread_function is running. Argument was %s\n", (char *)arg);
sleep(4);
printf("Second thread setting finished flag, and exiting now\n");
thread_finished = 1;
pthread_exit(NULL);
}
ΠΡΠ²ΠΎΠ΄ Π½Π΅ ΠΏΡΠΈΠ½Π΅ΡΠ΅Ρ ΡΡΡΠΏΡΠΈΠ·ΠΎΠ²:
$ ./threads
Waiting for thread to say it's finished...
thread_function is running. Argument was Hello World
Waiting for thread to say it's finished...
Waiting for thread to say it's finished...
Waiting for thread to say it's finished...
Second thread setting finished flag, and exiting now
Other thread finished, bye!
ΠΠ°ΠΊ Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠ° ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠΎΡΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΎ, Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌΡ ΠΏΠΎΡΠΎΠΊΡ ΠΆΠ΄Π°ΡΡ ΡΡΠΎΠ³ΠΎ ΡΠΎΠ±ΡΡΠΈΡ.
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
Π ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠΌ ΡΠ΅ΠΊΡΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΄Π²Π° Π²Π°ΠΆΠ½ΡΡ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠ°:
pthread_attr_t thread_attr;
res = pthread_attr_init(&thread_attr);
if (res != 0) {
perror("Attribute creation failed");
exit(EXIT_FAILURE);
}
ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅Ρ Π°ΡΡΠΈΠ±ΡΡ ΠΏΠΎΡΠΎΠΊΠ° ΠΈ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ Π΅Π³ΠΎ, ΠΈ
res = pthread_attr_setdetachstatΠ΅(&thread_attr, PTHREAD_CREATE_DETACHED);
if (res != 0) {
perror("Setting detached attribute failed");
exit(EXIT_FAILURE);
}
ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² Π΄Π»Ρ Π·Π°Π΄Π°Π½ΠΈΡ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°.
Π Π΄ΡΡΠ³ΠΈΠΌ Π½Π΅Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΎΡΠ»ΠΈΡΠΈΡΠΌ ΠΎΡΠ½ΠΎΡΠΈΡΡΡ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ° Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅ΠΉ Π°Π΄ΡΠ΅ΡΠ° Π°ΡΡΠΈΠ±ΡΡΠΎΠ²:
res = pthread_create(&a_thread, &thread_attr, thread_function, (void*)message);
ΠΈ Π΄Π»Ρ Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΠΎΡΡΠΈ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ΠΈΠ΅ Π°ΡΡΠΈΠ±ΡΡΠΎΠ² ΠΏΠΎΡΠ»Π΅ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ:
pthread_attr_destroy(&thread_attr);
ΠΡΡΠΈΠ±ΡΡΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π²ΡΠΎΡΠΎΠΉ Π°ΡΡΠΈΠ±ΡΡ ΠΏΠΎΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π²Π°ΠΌ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°Ρ ΠΎΡΠ΅ΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ, β Π°ΡΡΠΈΠ±ΡΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ. ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ³ΠΎ Π°ΡΡΠΈΠ±ΡΡΠ° ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆΠ΅ Π½Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠ°, Π½ΠΎ Π΅ΡΡΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΡΡΡ Π΄Π»Ρ ΠΏΠΎΠ΄Π±ΠΎΡΠ° Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΡ ΡΡΠΎΠ²Π½Π΅ΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ°, sched_get_priority_max ΠΈ sched_get_priority_min.
ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 12.6.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 12.6. ΠΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ Π΄Π°Π½Π½Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° thread6.c ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆΠ° Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π³ΠΎ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΡ, ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΠ»ΠΈΡΠΈΡ.
1. ΠΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ΅Π³ΠΎ, Π²Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ :
int max_priority;
int min_priority;
struct sched_param scheduling_value;
2. ΠΠΎΡΠ»Π΅ ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ Π°ΡΡΠΈΠ±ΡΡ ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ, Π²Ρ Π·Π°Π΄Π°Π΅ΡΠ΅ ΠΏΠΎΠ»ΠΈΡΠΈΠΊΡ ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ:
res = pthread_attr_setschedpolicy(&thread_attr, SCHED_OTHER);
if (res != 0) {
perror("Setting scheduling policy failed");
exit(EXIT_FAILURE);
}
3. ΠΠ°Π»Π΅Π΅ Π½Π°Ρ ΠΎΠ΄ΠΈΡΠ΅ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠΎΠ²
max_priority = sched_get_priority_max(SCHED_OTHER);
min_priority = sched_get_priority_min(SCHED_OTHER);
ΠΈ Π·Π°Π΄Π°Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ :
scheduling_value.sched_priority = min_priority;
res = pthread_attr_setschedparam(&thread_attr, &scheduling_value);
if (res != 0) {
perror("Setting scheduling priority failed");
exit(EXIT_FAILURE);
}
ΠΠΎΠ³Π΄Π° Π²Ρ Π·Π°ΠΏΡΡΡΠΈΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π²ΡΠ²ΠΎΠ΄:
$ ./thread6
Waiting for thread to say it's finished...
thread_function is running. Argument was Hello World
Waiting for thread to say it's finished...
Waiting for thread to say it's finished...
Waiting for thread to say it's finished...
Second thread setting finished flag, and exiting now
Other thread finished, bye!
ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΡΠΎΡ ΠΏΡΠΈΠΌΠ΅Ρ ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆ Π½Π° ΡΡΡΠ°Π½ΠΎΠ²ΠΊΡ Π°ΡΡΠΈΠ±ΡΡΠ° ΠΎΡΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΎΡΡΠΎΡΠ½ΠΈΡ Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π²Ρ Π·Π°Π΄Π°Π΅ΡΠ΅ Π²ΠΌΠ΅ΡΡΠΎ Π½Π΅Π³ΠΎ ΡΠΏΠΎΡΠΎΠ± ΠΏΠ»Π°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ.
ΠΡΠΌΠ΅Π½Π° ΠΏΠΎΡΠΎΠΊΠ°
ΠΠ½ΠΎΠ³Π΄Π° ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΊ ΠΏΠΎΠΏΡΠΎΡΠΈΠ» Π΄ΡΡΠ³ΠΎΠΉ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ Π΄ΠΎΡΡΠΎΡΠ½ΠΎ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ, ΠΎΡΠ΅Π½Ρ ΠΏΠΎΡ ΠΎΠΆΠΈΠΌ Π½Π° ΠΎΡΠΏΡΠ°Π²ΠΊΡ Π΅ΠΌΡ ΡΠΈΠ³Π½Π°Π»Π°. Π‘Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΈ ΠΏΠ°ΡΠ°Π»Π»Π΅Π»ΡΠ½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠΈΠ³Π½Π°Π»Π°; Ρ ΠΏΠΎΡΠΎΠΊΠΎΠ² ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ²ΠΎΠ΅ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΈΡ ΠΏΡΠΎΡΡΡ Π·Π°Π²Π΅ΡΡΠΈΡΡΡΡ.
ΠΠ°Π²Π°ΠΉΡΠ΅ ΡΠ½Π°ΡΠ°Π»Π° ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ Π·Π°ΠΏΡΠΎΡΠ° Π½Π° Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡΠΎΠΊΠ°.
#include <pthread.h>
int pthread_cancel(pthread_t thread);
ΠΠ½Π° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠ°: ΠΈΠΌΠ΅Ρ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ ΠΏΠΎΡΠΎΠΊΠ°, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π·Π°ΠΏΡΠΎΡΠΈΡΡ Π΅Π³ΠΎ Π°Π½Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅. ΠΠ° ΠΏΡΠΈΠ΅ΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΠ° Π½Π° ΠΎΡΠΌΠ΅Π½Ρ Π²ΡΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅, Π½ΠΎ Π½Π΅ ΡΠ»ΠΈΡΠΊΠΎΠΌ. ΠΠΎΡΠΎΠΊ ΠΌΠΎΠΆΠ΅Ρ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ ΠΎΡΠΌΠ΅Π½Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ pthread_setcancelstate.
#include <pthread.h>
int pthread_setcancelstate(int state, int *oldstate);
ΠΠ΅ΡΠ²ΡΠΉ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ ΡΠ°Π²Π΅Π½ Π»ΠΈΠ±ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ PHTREAD_CANCEL_ENABLE, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠ΅ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°ΡΡ Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΠΎΡΠΌΠ΅Π½Ρ, Π»ΠΈΠ±ΠΎ PTHREAD_CANCEL_DISABLE, Π·Π°ΡΡΠ°Π²Π»ΡΡΡΠ΅ΠΌΡ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ Π·Π°ΠΏΡΠΎΡΡ. Π£ΠΊΠ°Π·Π°ΡΠ΅Π»Ρ oldstate Π΄Π°Π΅Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅. ΠΡΠ»ΠΈ ΠΎΠ½ΠΎ Π²Π°Ρ Π½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ Π² ΡΡΠΎΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ NULL. ΠΡΠ»ΠΈ Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΠΎΡΠΌΠ΅Π½Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡΡΡ, Π΅ΡΡΡ Π²ΡΠΎΡΠΎΠΉ ΡΡΠΎΠ²Π΅Π½Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ, ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡΠΉ ΠΏΠΎΡΠΎΠΊΠΎΠΌ, β ΡΠΈΠΏ ΠΎΡΠΌΠ΅Π½Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π·Π°Π΄Π°Π΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΠ΅ΠΉ pthread_setcanceltype.
#include <pthread.h>
int pthread_setcanceltype(int type, int *oldtype);
Π’ΠΈΠΏ ΠΎΡΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ½ΠΈΠΌΠ°ΡΡ ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ: PTHREAD_CANCEL_ASYNCHRONOUS, Π·Π°ΡΡΠ°Π²Π»ΡΡΡΠ΅Π΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΠΎΡΠΌΠ΅Π½Ρ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ, ΠΈ PTHREAD_CANCEL_DEFERRED, Π·Π°ΡΡΠ°Π²Π»ΡΡΡΠ΅Π΅ Π·Π°ΠΏΡΠΎΡΡ Π½Π° ΠΎΡΠΌΠ΅Π½Ρ ΠΆΠ΄Π°ΡΡ, ΠΏΠΎΠΊΠ° ΠΏΠΎΡΠΎΠΊ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΠΈΡ ΠΎΠ΄Π½Ρ ΠΈΠ· ΡΠ»Π΅Π΄ΡΡΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ: pthread_join, pthread_cond_wait, pthread_cond_timedwait, pthread_testcancel, sem_wait ΠΈΠ»ΠΈ sigwait.
ΠΡ Π½Π΅ ΠΎΠΏΠΈΡΡΠ²Π°Π΅ΠΌ Π²ΡΠ΅ ΡΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π² Π΄Π°Π½Π½ΠΎΠΉ Π³Π»Π°Π²Π΅, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ, ΠΊΠ°ΠΊ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ, Π½Π΅ Π²ΡΠ΅ ΠΎΠ½ΠΈ Π½ΡΠΆΠ½Ρ. ΠΠΎΠ³Π΄Π° ΠΎΠ½ΠΈ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΡΡΡΡ, Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΠΉΡΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΠ°Ρ ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΎΠ³ΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π°.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅Π ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ ΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠΎΠΌ POSIX ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ, ΡΠΏΠΎΡΠΎΠ±Π½ΡΠ΅ Π·Π°Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ read, wait ΠΈ Ρ.Π΄., Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ°ΠΊΠΆΠ΅ Π±ΡΡΡ ΡΠΎΡΠΊΠ°ΠΌΠΈ ΠΎΡΠΌΠ΅Π½Ρ ΠΏΠΎΡΠΎΠΊΠ°. ΠΠΎ Π²ΡΠ΅ΠΌΡ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΡ ΠΊΠ½ΠΈΠ³ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠ° ΡΡΠΎΠ³ΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ° Π² ΠΠ‘ Linux ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ»Π°ΡΡ Π½Π΅Π·Π°Π²Π΅ΡΡΠ΅Π½Π½ΠΎΠΉ. ΠΠΎ ΠΊΠΎΠ΅-ΠΊΠ°ΠΊΠ°Ρ ΡΠ°Π±ΠΎΡΠ° Π±ΡΠ»Π° ΠΏΡΠΎΠ΄Π΅Π»Π°Π½Π°, ΡΠΊΠ°ΠΆΠ΅ΠΌ, Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ Π·Π°Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡΠΈΠ΅ Π²ΡΠ·ΠΎΠ²Ρ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ sleep, Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Π΄ΠΎΠΏΡΡΠΊΠ°ΡΡ ΠΎΡΠΌΠ΅Π½Ρ. ΠΠ»Ρ ΡΠΎΠ³ΠΎ ΡΡΠΎΠ±Ρ ΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠΈΡΡ ΡΠ΅Π±Ρ, Π΄ΠΎΠ±Π°Π²Π»ΡΠΉΡΠ΅ Π²ΡΠ·ΠΎΠ²Ρ pthread_testcancel Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΡΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎ Π²Π°ΡΠΈΠΌ ΡΠ°ΡΡΠ΅ΡΠ°ΠΌ ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΎΡΠΌΠ΅Π½Π΅Π½.
ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ oldtype ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅Π΅ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅, Π΅ΡΠ»ΠΈ ΠΎΠ½ΠΎ Π²Π°Ρ Π½Π΅ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ΅Ρ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ NULL. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΠΎΡΠΎΠΊΠΈ Π·Π°ΠΏΡΡΠΊΠ°ΡΡΡΡ Ρ ΡΠΎΡΡΠΎΡΠ½ΠΈΠ΅ΠΌ ΠΎΡΠΌΠ΅Π½Ρ, ΡΠ°Π²Π½ΡΠΌ PTHREAD_CANCEL_ENABLE, ΠΈ ΡΠΈΠΏΠΎΠΌ ΠΎΡΠΌΠ΅Π½Ρ β PTHREAD_CANCEL_DEFERRED.
ΠΡΠΏΠΎΠ»Π½ΠΈΡΠ΅ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 12.7.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 12.7. ΠΡΠΌΠ΅Π½Π° ΠΏΠΎΡΠΎΠΊΠ°ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° thread7.c β Π΅ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΏΠΎΡΠΎΠΌΠΎΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ thread1.Ρ. ΠΠ° ΡΡΠΎΡ ΡΠ°Π· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡ Π½Π° ΠΎΡΠΌΠ΅Π½Ρ ΠΏΠΎΡΠΎΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΠ½ ΡΠΎΠ·Π΄Π°Π».
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
void *thread_function(void *arg);
int main() {
int res;
pthread_t a_thread;
void *thread_result;
res = pthread_create(&a_thread, NULL, thread_function, NULL);
if (res != 0) {
perror("Thread creation failed");
exit(EXIT_FAILURE);
}
sleep(3);
printf("Canceling thread...\n");
res = pthread_cancel(a_thread);
if (res != 0) {
perror("Thread cancelation failed");
exit(EXIT_FAILURE);
}
printf("Waiting for thread to finish...\n");