Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«ΠžΡΠ½ΠΎΠ²Ρ‹ программирования Π² LinuxΒ». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 140

Автор НСйл ΠœΡΡ‚ΡŒΡŽ

Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с отсоСдинСнным ΠΈΠ»ΠΈ обособлСнным ΠΏΠΎΡ‚ΠΎΠΊΠΎΠΌ 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");