Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
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_exitpthread_mutex_t work_mutex; /* защищает work_area и time_to_exit */#define WORK_SIZE 1024char work_area[WORK_SIZE];int time_to_exit = 0;Далее инициализируется мьютекс:
res = pthread_mutex_init(&work_mutex, NULL);if (res != 0) { perror("Mutex initialization failed"); exit(EXIT_FAILURE);}Затем запускается новый поток. Далее приведен код, выполняемый в функции потока:
pthread_mutex_lock(&work_mutex);while(strncmp("end", work_area, 3) != 0) { printf("You input id charactersn", strlen(work_area)-1); work_area[0] = ' '; pthread_mutex_unlock(&work_mutex); sleep(1); pthread_mutex_lock(&work_mutex); while (work_area[0] == ' ') { pthread_mutex_unlock(&work_mutex); sleep(1); pthread_mutex_lock(&work_mutex); }}time_to_exit = 1;work_area[0] = ' ';pthread_mutex_unlock(&work_mutex);Сначала новый поток пытается заблокировать мьютекс. Если он уже заблокирован, вызов задерживается до тех пор, пока мьютекс не освободится. После получения доступа вы проверяете, нет ли к вам запроса на завершение выполнения. Если запрашивается завершение, просто задайте переменную
time_to_exitЕсли вы не хотите завершать выполнение, сосчитайте символы и очистите первый символ, сделав его пустым (null). Пустой первый символ применяется как способ информирования считывающей программы о завершении подсчета символов. Далее вы открываете мьютекс и ждете выполнения потока
mainДалее приведен поток
mainpthread_mutex_lock(&work_mutex)printf("Input some text. Enter 'end' to finishn");while (!time_to_exit) { fgets(work_area, WORK_SIZE, stdin); pthread_mutex_unlock(&work_mutex); while(1) { pthread_mutex_lock(&work_mutex); if (work_area[0] != ' ') { pthread_mutex_unlock(&work_mutex); sleep(1); } else { break; } }}pthread_mutex_unlock(&work_mutex);Он аналогичен второму потоку. Вы блокируете рабочую область и можете читать в нее текст, а затем вы снимаете блокировку, чтобы открыть доступ другому потоку для подсчета слов. Периодически вы блокируете мьютекс, проверяете, сосчитаны ли слова (элемент
work_area[0]Атрибуты потока
Когда мы начали рассматривать потоки, то не обсуждали более сложную тему — атрибуты потока. Теперь, рассказав о синхронизации потоков — ключевой теме главы, мы можем вернуться назад и остановиться на этих характеристиках потока. Существует лишь несколько атрибутов потока, которыми вы можете управлять; здесь мы собираемся обсудить только те, которые вам понадобятся, скорее всего. Подробную информацию о других атрибутах вы можете найти в интерактивном справочном руководстве.
Во всех предыдущих примерах вы должны были повторно синхронизовать потоки с помощью функции
pthread_joinmainmainПредположим, что вы создаете второй поток для записи в буфер резервной копии файла данных, который редактируется, пока поток
mainmain
