Функционирование

Файл tfplib.c содержит API библиотеки для идентификации потоков, который может вызываться любым потоком. Главной функцией является tfp_mark(), она используется для привязки маркера к вызывающему ее потоку. Вспомогательные функции tfp_read_raw_block() и tfp_write_raw_block() используются для чтения и записи 64-байтного блока двоичных данных. Никакого особого смысла этому блоку не предается, приложение может использовать его по своему усмотрению. Я предусмотрел его для хранения переменных состояния или прогресса выполнения. Как использовался этот блок в Photuris (если использовался вообще), я не знаю. Но он есть и много места не занимает.

Библиотека демонстрирует применение определенных в POSIX ключевых данных потоков.

Следующие функции являются определяющими для библиотеки:

pthread_key_create(), pthread_getspecific(), и pthread_setspecific()
Вы можете найти описание этих функций в C Library Reference, которое поставляется с вашей системой Neutrino.
В нашей реализации эти функции используются потоком для создания и регистрации (а также перерегистрации так часто, как это необходимо) его маркера. (Обычно эти функции используются потоками когда необходим доступ к области данных, локальной для потока. Для большей информации смотрите описание в документации.)

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

#include
#include

#include «tfplib.h»

int
main (int argc, char **argv)
{
printf («Hello, world\n»);
tfp_mark («Main thread sleeping»);
sleep (60);
tfp_mark («Main thread about to exit»);
sleep (10);
exit (EXIT_SUCCESS);
}
Приведенный выше пример представляет собой незначительную модификацию стандартной программы «Hello, world». Главный поток этой программы использует TFP библиотеку для того, чтобы маркировать себя строкой «Главный поток спит» и засыпает на 60 секунд. Потом поток изменяет маркер на «Главный поток готовится к завершению» и ждет еще 10 секунд прежде чем завершиться.

Запуск утилиты tfp (которую мы обсудим позже) три раза выдает следующий результат:

# tfp
PID 17932361 «.//a.out»
TID 1 2003 10 09 16:21:46 Главный поток спит
PID 18878540 «/source//photuris/parse/tfp/x86/o/tfp»
TID 1 2003 10 09 16:22:44 Главный поток TFP

# tfp
PID 17932361 «.//a.out»
TID 1 2003 10 09 16:22:46 Главный поток готовится к завершению
PID 18911308 «/source//photuris/parse/tfp/x86/o/tfp»
TID 1 2003 10 09 16:22:46 Главный поток TFP

# tfp
PID 19071049 «/source//photuris/parse/tfp/x86/o/tfp»
TID 1 2003 10 09 16:25:08 Главный поток TFP
Когда я запустил ее первый раз, тестовая программа, приведенная выше, как раз заснула на 60 секунд, так что утилита показала, что процесс имеет один поток (который является главным для процесса), и этот поток маркирован строкой «Главный поток спит». Заметьте, что второй процесс — это сама утилита tfp — ее главный поток промаркирован строкой «Главный поток TFP».

Минутой позже я запустил утилиту снова, и на этот раз тестовая программа изменила свой маркер на «Главный поток готовится к завершению».

В завершении теста, третий запуск tfp (несколькими минутами позже) выдал результат только для нее самой.