Использование библиотеки С впотоках

Использование библиотеки С впотоках

В большинстве программ требуется библиотека С, хотя бы для того, чтобы обеспечить выполнение операций над строками. Исторически так сложилось, что библиотека С была рассчитана на применение в однопоточных процессах, поэтому для хранения промежуточных результатов многие функции используют области глобальной памяти. Подобные библиотеки, в которых отсутствует многопоточная поддержка, не являются безопасными (thread-safe) с точки зрения одновременного выполнения нескольких потоков, поскольку, например, одновременно две независимые потоки могут пытаться получить доступ к библиотеке и изменить данные, содержащиеся в ее глобальной памяти. Принципы проектирования многопоточных программ будут вновь обсуждаться в главе 8, в которой описывается синхронизация объектов Windows.

Пример функции strtok показывает, почему при написании некоторых функций библиотеки С не учитывалась многопоточная поддержка. Функция strtok, просматривающая строку в поиске очередного вхождения определенной лексемы, поддерживает сохранение состояния (persistent state) между последовательными вызовами функции, и это состояние хранится в области статической памяти, совместный доступ к которой имеют все потоки, вызывающие эту функцию. 

Microsoft С решает эту проблему, предлагая реализацию библиотеки С под названием LIBCMT.LIB, которая обеспечивает многопоточную поддержку. Однако, это еще не все. Вы не должны использовать функцию CreateThread; для запуска потока и создания специфической для него области рабочей памяти библиотеки LIBCMT.LIB необходимо пользоваться специальной функцией С, а именно, функцией _beginthreadex. Для завершения потока вместо функции ExitThread применяется функция _endthreadex.

Примечание

В качестве упрощенного варианта функции _beginthreadex предусмотрена функция _beginthread, однако использовать ее не рекомендуется. Прежде всего, функция _beginthread не имеет ни атрибутов, ни флагов защиты и не возвращает идентификатор потока. Более того, в действительности она закрывает дескриптор потока, который создает, в результате чего возвращенное значение дескриптора может оказаться недействительным на момент его сохранения родительским потоком. Не следует вызывать и функцию _endthread; она не позволяет пользоваться возвращаемым значением.

Аргументы функции _beginthreadex в точности совпадают с аргументами функций Windows, однако типы данных Windows для этой функции не определены, и поэтому тип возвращаемого значения функции _beginthread необходимо привести к типу HANDLE, что позволит избежать появления предупреждающих сообщений. Убедитесь в том, что определение символической константы _МТ предшествует любому из включаемых файлов; в примерах программ это определение содержится в файле Envirmnt.h. Больше от вас ничего не требуется. Резюмируя, перечислим действия, которые вы должны выполнить, если имеете дело со средой разработки Visual C++.

• Подключите библиотеку LIBCMT.LIB и откажитесь от использования библиотеки, заданной по умолчанию.

• Включите директиву #define _MT во все исходные файлы, в которых используется библиотека С.

• Добавьте включаемый файл <process.h>, содержащий определения функций _beginthreadex и _endthreadex.

• Создайте потоки с помощью функции _beginthreadex; не применяйте для этой цели функцию CreateThread.

• Завершите потоки посредством функции _endthreadex или просто воспользуйтесь оператором return в конце функции потока.

В приложении А вы найдете указания относительно того, как создавать многопоточные приложения. В частности, можно, и даже рекомендуется, указывать библиотеку и определять константу _МТ непосредственно в среде разработки.

Именно так будут построены все наши примеры, и функция CreateThread никогда не будет непосредственно применяться в программах даже в тех случаях, когда библиотека С в функциях потоков не используется. 

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

4.4. Библиотеки

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

4.4. Библиотеки Одним из последствий того влияния, которое стиль Unix-программирования оказал на модульность и четко определенные API-интерфейсы, является устойчивая тенденция к разложению программ на фрагменты связующего уровня, объединяющего семейства библиотек,


Библиотеки

Из книги Основы AS/400 автора Солтис Фрэнк

Библиотеки В OS/400 библиотека — объект, который используется для поиска других объектов в базе данных. В отличие от многоуровневой иерархии каталогов в ОС ПК и Unix, библиотека OS/400 имеет одноуровневую иерархию. Для иллюстрации рассмотрим структуру имен объектов OS/400.Чтобы


Библиотеки и библиотеки

Из книги Что вы все о копирайте, лучше бы книжку почитали автора Мошков Максим

Библиотеки и библиотеки Известно, что большие собрания пополняются за счет малых. Небезынтересно узнать — на каких условиях? Наверняка ведь считается неэтичным просто скачать текст у другого библиотекаря и выложить в своей библиотеке. А как они это делают?Известно, что


Библиотеки TR1 и Boost

Из книги Эффективное использование C++. 55 верных способов улучшить структуру и код ваших программ автора Мейерс Скотт

Библиотеки TR1 и Boost Ссылки на библиотеки TR1 и Boost вы будете встречать на протяжении всей этой книги. Каждой из них посвящено отдельное правило (54 – TR1 и 55 – Boost), но, к сожалению, они находятся в самом конце книги. При желании можете прочесть их прямо сейчас, но если вы


4.4. Библиотеки

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

4.4. Библиотеки Одним из последствий того влияния, которое стиль Unix-программирования оказал на модульность и четко определенные API-интерфейсы, является устойчивая тенденция к разложению программ на фрагменты связующего уровня, объединяющего семейства библиотек,


Библиотеки

Из книги Основы объектно-ориентированного программирования автора Мейер Бертран

Библиотеки Один из характерных аспектов разработки ПО ОО-способом - возможность создавать его на основе существующих библиотек. ОО-среда должна обеспечивать хорошие библиотеки и механизмы создания новых


14.3.1. Использование библиотеки Shell для перенаправления ввода/вывода

Из книги Программирование на языке Ruby [Идеология языка, теория и практика применения] автора Фултон Хэл

14.3.1. Использование библиотеки Shell для перенаправления ввода/вывода В классе Shell для создания объектов есть два метода: new и cd. Первый создает объект, ассоциированный с текущим каталогом, второй — объект, для которого рабочим будет указанный каталог.require "shell"sh1 =


Использование библиотеки Ext Core

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов. автора Дронов Владимир

Использование библиотеки Ext Core Библиотека Ext Core распространяется с Web-страницы http://www.extjs.com/products/core/?ref=family своего "домашнего" Web-сайта. На ней мы найдем гиперссылки на Web-страницы загрузки библиотеки, краткое руководство программиста с примерами и полный справочник по


Использование библиотеки Ext Core

Из книги HTML 5, CSS 3 и Web 2.0. Разработка современных Web-сайтов автора Дронов Владимир

Использование библиотеки Ext Core Библиотека Ext Core распространяется с Web-страницы http://www.extjs.com/products/core/?ref=family своего "домашнего" Web-сайта. На ней мы найдем гиперссылки на Web-страницы загрузки библиотеки, краткое руководство программиста с примерами и полный справочник по


8.1. Статические библиотеки

Из книги Разработка приложений в среде Linux. Второе издание автора Джонсон Майкл К.

8.1. Статические библиотеки Статические библиотеки представляют собой простые коллекции объектных файлов, объединенных утилитой ar (архиватор), ar группирует объектные файлы в один архив и добавляет таблицу, в которой указано, какие объектные файлы в архиве какие символы


1.5. Библиотеки

Из книги Первые шаги с Windows 7. Руководство для начинающих автора Колисниченко Денис Н.

1.5. Библиотеки Впервые библиотеки (виртуальные папки) появились еще в Windows Vista Beta 1, но почему-то эту функцию не включили в состав релиза Vista. В Windows 7 данная функция появилась вновь. Виртуальная папка (библиотека) объединяет несколько обычных папок, возможно, расположенных на


Библиотеки

Из книги Реестр Windows 7 автора Климов Александр Петрович

Библиотеки Библиотеки являются новинкой для операционных систем Windows. Библиотеки упрощают поиск, упорядочивание файлов, распределенных на компьютере или в сети. Библиотека объединяет содержимое в одном месте независимо от того, где оно фактически хранится. В левой


Библиотеки

Из книги Недокументированные и малоизвестные возможности Windows XP автора Клименко Роман Александрович

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


Использование библиотеки классов

Из книги Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil автора Ковязин Алексей Николаевич

Использование библиотеки классов Библиотека классов поставляется в виде исходных текстов. Поэтому для ее использования нужно выполнять следующие требования:* Явно добавить в проект файлы из каталога Lib:ole_liboledboledb_client_lib.cpp Основные классы для работы с OLE


Библиотеки

Из книги Установка, настройка и восстановление Windows 7 на 100% автора Ватаманюк Александр Иванович

Библиотеки Польза следующего нововведения явно очевидна. В Windows 7 существуют специальные папки Документы, Изображения, Музыка и Видео, с которыми пользователи работают достаточно часто. Если раньше, в Windows Vista или Windows ХР, каждая подобная папка ссылалась на одну реальную


Библиотеки dll

Из книги Описание языка PascalABC.NET автора Коллектив РуБоард

Библиотеки dll Библиотеки dll (dynamically linked libraries):* содержат группу взаимосвязанных подпрограмм* находятся в откомпилированном файле* предназначены для обращения к ним из различных программОни находятся в файле с расширением .dll либо в текущем каталоге приложения (локальные),