Марк Митчелл - Программирование для Linux. Профессиональный подход

Здесь есть возможность читать онлайн «Марк Митчелл - Программирование для Linux. Профессиональный подход» весь текст электронной книги совершенно бесплатно (целиком полную версию без сокращений). В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: Москва, Год выпуска: 2002, ISBN: 2002, Издательство: Вильямс, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

Программирование для Linux. Профессиональный подход: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «Программирование для Linux. Профессиональный подход»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Данная книга в основном посвящена программированию в среде GNU/Linux. Авторы применяют обучающий подход, последовательно излагая самые важные концепции и методики использования расширенных возможностей системы GNU/Linux в прикладных программах. Читатели научатся писать программы, к интерфейсу которых привыкли пользователи Linux; освоят такие технологии, как многозадачность, многопотоковое программирование, межзадачное взаимодействие и взаимодействие с аппаратными устройствами; смогут улучшить свои программы, сделав их быстрее, надежнее и безопаснее; поймут особенности системы GNU/Linux, ее ограничения, дополнительные возможности и специфические соглашения.
Книга предназначена для программистов, уже знакомых с языком С и имеющих базовый опыт работы в GNU/Linux.

Программирование для Linux. Профессиональный подход — читать онлайн бесплатно полную книгу (весь текст) целиком

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «Программирование для Linux. Профессиональный подход», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

В листинге 4.3 приведена исправленная версия функции main()из предыдущего, неправильного примера. В данном случае функция main()не завершается, пока оба дочерних потока не выполнят свои задания и не перестанут ссылаться на переданные им структуры.

Листинг 4.3. Исправленная функция main()из файла thread-create.c

int main() {

pthread_t thread1_id;

pthread_t thread2_id;

struct char_print_parms thread1_args;

struct char_print_parms thread2_args;

/* Создание нового потока, отображающего 30000

символов 'x'. */

thread1_args.character = 'x';

thread1_args.count = 30000;

pthread_create(&thread1_id, NULL, &char_print, &thread1_args);

/* Создание нового потока, отображающего

20000 символов 'o'. */

thread2_args.character = 'o';

thread2_args.count = 20000;

pthread_create(&thread2_id, NULL, &char_print, &thread2_args);

/* Убеждаемся, что завершился первый поток. */

pthread_join(thread1_id, NULL);

/* Убеждаемся, что завершился второй поток. */

pthread_join(thread2_id, NULL);

/* Теперь можно спокойно завершать работу. */

return 0;

}

Мораль сей басни такова: убедитесь, что любые данные, переданные потоку по ссылке, не удаляются ( даже другим потоком ) до тех пор, пока поток не завершит свою работу с ними. Это относится как к локальным переменным, удаляемым автоматически при выходе за пределы своей области видимости, так и к динамическим переменным, удаляемым с помощью функции free()(или оператора deleteв C++).

4.1.3. Значения, возвращаемые потоками

Если второй аргумент функции pthread_join()не равен NULL, то в него помещается значение, возвращаемое потоком. Как и потоковый аргумент, это значение имеет тип void*. Если поток возвращает обычное число типа int, его можно свободно привести к типу void*, а затем выполнить обратное преобразование по завершении функции pthread_join(). [13] Данный способ не является стандартным. В обязанности программиста входит убедиться, что в процессе подобных преобразований не произойдет потеря значащих разрядов.

Программа, представленная в листинге 4.4, в отдельном потоке вычисляет n -е простое число и возвращает его в программу. Тем временем функция main()может продолжать свои собственные вычисления. Сразу признаемся: алгоритм последовательного деления, используемый в функции compute_prime(), весьма неэффективен. В книгах по численным методам описаны более мощные алгоритмы (например, "решето Эратосфена").

Листинг 4.4. ( primes.с ) Вычисление простых чисел в потоке

#include

#include

/* Находим простое число с порядковым номером N, где N -- это

значение, на которое указывает параметр ARG. */

void* compute_prime(void* arg) {

int candidate = 2;

int n = *((int*)arg);

while (1) {

int factor;

int is_prime = 1;

/* Проверка простого числа путем последовательного деления. */

for (factor = 2; factor < candidate; ++factor)

if (candidate % factor == 0) {

is_prime = 0;

break;

}

/* Это то простое число, которое нам нужно? */

if (is_prime) {

if (--n == 0)

/* Возвращаем найденное число в программу. */

return (void*)candidate;

}

++candidate;

}

return NULL;

}

int main() {

pthread_t thread;

int which_prime = 5000;

int prime;

/* Запускаем поток, вычисляющий 5000-е простое число. */

pthread_create(&thread, NULL, &compute_prime, &which_prime);

/* Выполняем другие действия. */

/* Дожидаемся завершения потока и принимаем возвращаемое им

значение. */

pthread_join(thread, (void*)&prime);

/* Отображаем вычисленный результат. */

printf("The %dth prime number is %d.\n", which_prime, prime);

return 0;

}

4.1.4. Подробнее об идентификаторах потоков

Иногда в программе возникает необходимость определить, какой поток выполняет ее в данный момент. Функция pthread_self()возвращает идентификатор потока, в котором она вызвана. Для сравнения двух разных идентификаторов предназначена функция pthread_equal().

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

if (!pthread_equal(pthread_self(), other_thread)) pthread_join(other_thread, NULL);

4.1.5. Атрибуты потоков

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Похожие книги на «Программирование для Linux. Профессиональный подход»

Представляем Вашему вниманию похожие книги на «Программирование для Linux. Профессиональный подход» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


Отзывы о книге «Программирование для Linux. Профессиональный подход»

Обсуждение, отзывы о книге «Программирование для Linux. Профессиональный подход» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x