Основы программирования в Linux
Основы программирования в Linux читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
<b>#include <рthread.h></b><b>int pthread_mutex_init(pthread_mutex_t* mutex,</b><b> const pthread_mutexattr_t *mutexattr);</b><b>int pthread_mutex_lock(pthread_mutex_t* mutex);</b><b>int pthread_mutex_unlock(pthread mutex_t* mutex);</b><b>int pthread_mutex_destroy(pthread_mutex_t *mutex);</b>Как обычно, в случае успешного завершения возвращается 0 и код ошибки в случае аварийного завершения, но переменная
errnoКак и функции семафоров, функции мьютексов принимают указатель на предварительно объявленный объект, в данном случае типа
pthread_mutex_tpthread_mutex_initpthread_mutex_lockУстановка атрибутов мьютекса в этой книге не рассматривается, поэтому мы будем передавать
NULLpthread_mutex_initВыполните упражнение 12.4.
Далее приводится еще одна модификация исходной программы thread1.с, но значительно измененная. На этот раз вы уделите особое внимание доступу к вашим важным переменным и примените мьютекс для того, чтобы быть уверенными в том, что они доступны в любой момент времени только одному потоку. Для легкости чтения текста примера мы пропустили некоторые проверки ошибок при возвратах из мьютекса, заблокированного и открытого. В рабочем программном коде вы обязательно должны проверять эти возвращаемые значения. Далее приведен текст новой программы thread4.c.
#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <pthread.h>#include <semaphore.h>void *thread_function(void *arg);pthread_mutex_t work_mutex; /* защищает work_area и time_to_exit */#define WORK_SIZE 1024char work_area[WORK_SIZE];int time_to_exit = 0;int main() { int res; pthread_t a_thread; void *thread_result; res = pthread_mutex_init(&work_mutex, NULL); if (res != 0) { perror("Mutex initialization failed"); exit(EXIT_FAILURE); } res pthread_create(&a_thread, NULL, thread_function, NULL); if (res != 0) { perror("Thread creation failed"); exit(EXIT_FAILURE); } pthread_mutex_lock(&work_mutex); printf("Input same 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); printf("nWaiting for thread to finish...n"); res = pthread_join(a_thread, &thread_result); if (res ! = 0) { perror("Thread join failed"); exit(EXIT_FAILURE); } printf("Thread joinedn"); pthread_mutex_destroy(&work_mutex); exit(EXIT_SUCCESS);}void *thread_function(void *arg) { sleep(1); pthread_mutex_lock(&work_mutex); while(strncmp("end", work_area, 3) ! = 0) { printf("You input %d 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);
