e-knigi.com

Основы программирования в Linux - Мэтью Нейл

На этом ресурсе Вы можете бесплатно читать книгу онлайн Основы программирования в Linux - Мэтью Нейл. Жанр: Программирование . На сайте e-Knigi.com Вы можете онлайн читать полную версию книги без регистрации и sms. Так же Вы можете ознакомится с содержанием, описанием, предисловием о произведении
Перейти на страницу:

   pthread_mutex_lock(&work_mutex);

  }

 }

 time_to_exit = 1;

 work_area[0] = '';

 pthread_mutex_unlock(&work_mutex);

 pthread_exit(0);

}

После запуска вы получите следующий вывод:

$ <b>cc -D_REENTRANT thread4.с -о thread4 -lpthread</b>

$ <b>./thread4</b>

Input some text. Enter 'end' to finish

<b>Whit</b>

You input 4 characters

<b>The Crow Road</b>

You input 13 characters

<b>end</b>

Waiting for thread to finish...

Thread joined

Как это работает

Вы начинаете с объявления мьютекса вашей рабочей области и на сей раз дополнительной переменной

time_to_exit
:

pthread_mutex_t work_mutex; /* защищает work_area и time_to_exit */

#define WORK_SIZE 1024

char work_area[WORK_SIZE];

int time_to_exit = 0;

Далее инициализируется мьютекс:

res = pthread_mutex_init(&amp;work_mutex, NULL);

if (res != 0) {

 perror(&quot;Mutex initialization failed&quot;);

 exit(EXIT_FAILURE);

}

Затем запускается новый поток. Далее приведен код, выполняемый в функции потока:

pthread_mutex_lock(&amp;work_mutex);

while(strncmp(&quot;end&quot;, work_area, 3) != 0) {

 printf(&quot;You input id charactersn&quot;, strlen(work_area)-1);

 work_area[0] = '';

 pthread_mutex_unlock(&amp;work_mutex);

 sleep(1);

 pthread_mutex_lock(&amp;work_mutex);

 while (work_area[0] == '') {

  pthread_mutex_unlock(&amp;work_mutex);

  sleep(1);

  pthread_mutex_lock(&amp;work_mutex);

 }

}

time_to_exit = 1;

work_area[0] = '';

pthread_mutex_unlock(&amp;work_mutex);

Сначала новый поток пытается заблокировать мьютекс. Если он уже заблокирован, вызов задерживается до тех пор, пока мьютекс не освободится. После получения доступа вы проверяете, нет ли к вам запроса на завершение выполнения. Если запрашивается завершение, просто задайте переменную

time_to_exit
, сотрите первый символ в рабочей области и завершите выполнение. 

Если вы не хотите завершать выполнение, сосчитайте символы и очистите первый символ, сделав его пустым (null). Пустой первый символ применяется как способ информирования считывающей программы о завершении подсчета символов. Далее вы открываете мьютекс и ждете выполнения потока

main
. Периодически вы пытаетесь заблокировать мьютекс и, когда вам это удается, проверяете, подготовил ли поток main новую работу для вас. Если нет, вы открываете мьютекс и ждете какое-то время. Если работа есть, вы считаете символы и выполняете проход цикла снова.

Далее приведен поток

main
.

pthread_mutex_lock(&amp;work_mutex)

printf(&quot;Input some text. Enter 'end' to finishn&quot;);

while (!time_to_exit) {

 fgets(work_area, WORK_SIZE, stdin);

 pthread_mutex_unlock(&amp;work_mutex);

 while(1) {

  pthread_mutex_lock(&amp;work_mutex);

  if (work_area[0] != '') {

   pthread_mutex_unlock(&amp;work_mutex);

   sleep(1);

  } else {

   break;

  }

 }

}

pthread_mutex_unlock(&amp;work_mutex);

Он аналогичен второму потоку. Вы блокируете рабочую область и можете читать в нее текст, а затем вы снимаете блокировку, чтобы открыть доступ другому потоку для подсчета слов. Периодически вы блокируете мьютекс, проверяете, сосчитаны ли слова (элемент

work_area[0]
равен пустому символу), и освобождаете мьютекс, если нужно продолжить ожидание. Как уже отмечалось ранее, этот вид опроса и получения ответа в основном не слишком удачный прием и в реальной жизни вам, возможно, придется применить семафор для его замены. Тем не менее, программный код справляется с задачей демонстрации примера применения мьютекса.

Атрибуты потока

Когда мы начали рассматривать потоки, то не обсуждали более сложную тему — атрибуты потока. Теперь, рассказав о синхронизации потоков — ключевой теме главы, мы можем вернуться назад и остановиться на этих характеристиках потока. Существует лишь несколько атрибутов потока, которыми вы можете управлять; здесь мы собираемся обсудить только те, которые вам понадобятся, скорее всего. Подробную информацию о других атрибутах вы можете найти в интерактивном справочном руководстве.

Во всех предыдущих примерах вы должны были повторно синхронизовать потоки с помощью функции

pthread_join
, прежде чем разрешить программе завершить выполнение. Это необходимо сделать, если вы хотите, чтобы один поток вернул данные другому потоку, создавшему данный. Иногда вам не нужно ни возвращать информацию из второго потока в поток
main
, ни заставлять поток
main
ждать этого.

Предположим, что вы создаете второй поток для записи в буфер резервной копии файла данных, который редактируется, пока поток

main
продолжает обслуживать пользователя. Когда создание копии закончено, второй поток может тут же завершиться. Ему не нужно присоединяться к потоку
main
.

Перейти на страницу:

Мэтью Нейл читать все книги автора по порядку

Мэтью Нейл - на сайте онлайн книг e-Knigi.com Вы можете читать полные версии книг автора в одном месте.


Основы программирования в Linux отзывы

Отзывы читателей о книге Основы программирования в Linux, автор: Мэтью Нейл. Читайте комментарии и мнения людей о произведении.


Уважаемые читатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

  • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
  • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
  • 3. Просьба отказаться от нецензурной лексики.
  • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

Надеемся на Ваше понимание и благоразумие. С уважением, администрация сайта e-Knigi.com


Прокомментировать
Подтвердите что вы не робот:*