POSIX Threads

Поделись знанием:
Перейти к: навигация, поиск

POSIX Threads — стандарт POSIX реализации потоков (нитей) выполнения. Стандарт POSIX.1c, Threads extensions (IEEE Std 1003.1c-1995) определяет API для управления потоками, их синхронизации и планирования.

Реализации данного API существуют для большого числа UNIX-подобных ОС (GNU/Linux, Solaris, FreeBSD, OpenBSD, NetBSD, OS X), а также для Microsoft Windows и других ОС.

Библиотеки, реализующие этот стандарт (и функции этого стандарта), обычно называются Pthreads (функции имеют приставку «pthread_»).





Основные функции стандарта

Pthreads определяет набор типов и функций на языке программирования Си. Заголовочный файл — pthread.h.

  • Типы данных:
    • pthread_t: дескриптор потока;
    • pthread_attr_t: перечень атрибутов потока;
    • pthread_barrier_t: барьер;
    • pthread_barrierattr_t: атрибуты барьера;
    • pthread_cond_t: условная переменная;
    • pthread_condattr_t: атрибуты условной переменной;
    • pthread_key_t: данные, специфичные для потока;
    • pthread_mutex_t: мьютекс;
    • pthread_mutexattr_t: атрибуты мьютекса;
    • pthread_rwlock_t: ;
    • pthread_rwlockattr_t: ;
    • pthread_spinlock_t: спинлок;
  • Функции управления потоками:
    • pthread_create(): создание потока.
    • pthread_exit(): завершение потока (должна вызываться функцией потока при завершении).
    • pthread_cancel(): отмена потока.
    • pthread_join(): подключиться к другому потоку и ожидать его завершения; поток, к которому необходимо подключиться, должен быть создан с возможностью подключения (PTHREAD_CREATE_JOINABLE).
    • pthread_detach(): отключиться от потока, сделав его при этом отдельным (PTHREAD_CREATE_DETACHED).
    • pthread_attr_init(): инициализировать структуру атрибутов потока.
    • pthread_attr_setdetachstate(): указывает параметр "отделимости" потока (detach state), который говорит о возможности подключения к нему (при помощи pthread_join) других потоков (значение PTHREAD_CREATE_JOINABLE) для ожидания окончания или о запрете подключения (значение PTHREAD_CREATE_DETACHED); ресурсы отдельного потока (PTHREAD_CREATE_DETACHED) при завершении автоматически освобождаются и возвращаются системе.
    • pthread_attr_destroy(): освободить память от структуры атрибутов потока (уничтожить дескриптор).
  • Функции синхронизации потоков:
    • pthread_mutex_init(), pthread_mutex_destroy(), pthread_mutex_lock(), pthread_mutex_trylock(), pthread_mutex_unlock(): с помощью мьютексов.
    • pthread_cond_init(), pthread_cond_signal(), pthread_cond_wait(): с помощью условных переменных.

Пример

Пример использования потоков на языке C:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <pthread.h>

static void wait_thread( void )
{
    time_t start_time = time( NULL );

    while( time( NULL ) == start_time )
        ; /* do nothing except chew CPU slices for up to one second. */
}

static void* thread_func( void* vptr_args )
{
    unsigned i;

    for( i = 0; i < 20; ++i )
    {
        fputs( "b\n", stderr );
        wait_thread();
    }

    return NULL;
}

int main( void )
{
    unsigned i;
    pthread_t thread;

    if ( pthread_create( &thread, NULL, thread_func, NULL ) )
        return EXIT_FAILURE;

    for( i = 0; i < 20; ++i )
    {
        puts( "a\n" );
        wait_thread();
    }

    if ( pthread_join( thread, NULL ) )
        return EXIT_FAILURE;

    return EXIT_SUCCESS;
}

Пример использования потоков на языке C++:

#include <cstdlib>
#include <iostream>
#include <memory>
#include <unistd.h>
#include <pthread.h>
    
class Thread
{
public:
    virtual ~Thread() {}
		
    virtual void run() = 0;

    int start()          { return pthread_create( &_ThreadId, NULL,
                           Thread::thread_func, this ); }
    int wait ()          { return pthread_join( _ThreadId, NULL ); }

protected:
    pthread_t _ThreadId;

    Thread( const Thread& ); // disable copy constructor
    static void* thread_func( void* d ) { ( static_cast< Thread* >( d ) ) -> run(); return NULL; }
};

class TestingThread : public Thread
{
public:
    TestingThread( const char* pcszText ) : _pcszText( pcszText ) {}

    virtual void run()
    {
        for( unsigned i = 0; i < 20; ++i, sleep( 1 ) )
            std::cout << _pcszText << std::endl;
    }

protected:
    const char* _pcszText;
};

int main()
{
    TestingThread ThreadA( "a" );
    TestingThread ThreadB( "b" );
	
    return
        ThreadA.start() || ThreadB.start() ||
        ThreadA.wait() || ThreadB.wait() ?
            EXIT_FAILURE :
            EXIT_SUCCESS;
}

Представленные программы используют два потока, печатающих в консоль сообщения, один, печатающий 'a', второй — 'b'. Вывод сообщений смешивается в результате переключения выполнения между потоками или одновременном выполнении на мультипроцессорных системах.

Отличие состоит в том, что программа на C создает один новый поток для печати 'b', а основной поток печатает 'a'. Основной поток (после печати 'aaaaa….') ждёт завершения дочернего потока.

Программа на C++ создает два новых потока, один печатает 'a', второй, соответственно, — 'b'. Основной поток ждёт завершения обоих дочерних потоков.

См. также

Напишите отзыв о статье "POSIX Threads"

Ссылки

  • Статья «[www-128.ibm.com/developerworks/linux/library/l-posix1.html Объясняя потоки POSIX]», Даниэля Роббинса (основателя проекта Gentoo)  (англ.)
  • Интервью «[www.thinkingparallel.com/2007/04/11/ten-questions-with-david-butenhof-about-parallel-programming-and-posix-threads/ 10 вопросов Девиду Бутенхофу о параллельном программировании и потоках POSIX]» с Майклом Суиссом  (англ.)
  • [www.opengroup.org/onlinepubs/007904975/basedefs/pthread.h.html The Open Group Base Specifications Issue 6, IEEE Std 1003.1] (англ.)
  • [conferences.oreillynet.com/presentations/os2007/os_lamothe.pdf Pthreads Presentation at 2007 OSCON (O’Reilly Open Source Convention) by Adrien Lamothe. An overview of Pthreads with current trends] (англ.)

Отрывок, характеризующий POSIX Threads

Дрон был один из тех крепких физически и нравственно мужиков, которые, как только войдут в года, обрастут бородой, так, не изменяясь, живут до шестидесяти – семидесяти лет, без одного седого волоса или недостатка зуба, такие же прямые и сильные в шестьдесят лет, как и в тридцать.
Дрон, вскоре после переселения на теплые реки, в котором он участвовал, как и другие, был сделан старостой бурмистром в Богучарове и с тех пор двадцать три года безупречно пробыл в этой должности. Мужики боялись его больше, чем барина. Господа, и старый князь, и молодой, и управляющий, уважали его и в шутку называли министром. Во все время своей службы Дрон нн разу не был ни пьян, ни болен; никогда, ни после бессонных ночей, ни после каких бы то ни было трудов, не выказывал ни малейшей усталости и, не зная грамоте, никогда не забывал ни одного счета денег и пудов муки по огромным обозам, которые он продавал, и ни одной копны ужи на хлеба на каждой десятине богучаровских полей.
Этого то Дрона Алпатыч, приехавший из разоренных Лысых Гор, призвал к себе в день похорон князя и приказал ему приготовить двенадцать лошадей под экипажи княжны и восемнадцать подвод под обоз, который должен был быть поднят из Богучарова. Хотя мужики и были оброчные, исполнение приказания этого не могло встретить затруднения, по мнению Алпатыча, так как в Богучарове было двести тридцать тягол и мужики были зажиточные. Но староста Дрон, выслушав приказание, молча опустил глаза. Алпатыч назвал ему мужиков, которых он знал и с которых он приказывал взять подводы.
Дрон отвечал, что лошади у этих мужиков в извозе. Алпатыч назвал других мужиков, и у тех лошадей не было, по словам Дрона, одни были под казенными подводами, другие бессильны, у третьих подохли лошади от бескормицы. Лошадей, по мнению Дрона, нельзя было собрать не только под обоз, но и под экипажи.
Алпатыч внимательно посмотрел на Дрона и нахмурился. Как Дрон был образцовым старостой мужиком, так и Алпатыч недаром управлял двадцать лет имениями князя и был образцовым управляющим. Он в высшей степени способен был понимать чутьем потребности и инстинкты народа, с которым имел дело, и потому он был превосходным управляющим. Взглянув на Дрона, он тотчас понял, что ответы Дрона не были выражением мысли Дрона, но выражением того общего настроения богучаровского мира, которым староста уже был захвачен. Но вместе с тем он знал, что нажившийся и ненавидимый миром Дрон должен был колебаться между двумя лагерями – господским и крестьянским. Это колебание он заметил в его взгляде, и потому Алпатыч, нахмурившись, придвинулся к Дрону.
– Ты, Дронушка, слушай! – сказал он. – Ты мне пустого не говори. Его сиятельство князь Андрей Николаич сами мне приказали, чтобы весь народ отправить и с неприятелем не оставаться, и царский на то приказ есть. А кто останется, тот царю изменник. Слышишь?
– Слушаю, – отвечал Дрон, не поднимая глаз.
Алпатыч не удовлетворился этим ответом.
– Эй, Дрон, худо будет! – сказал Алпатыч, покачав головой.
– Власть ваша! – сказал Дрон печально.
– Эй, Дрон, оставь! – повторил Алпатыч, вынимая руку из за пазухи и торжественным жестом указывая ею на пол под ноги Дрона. – Я не то, что тебя насквозь, я под тобой на три аршина все насквозь вижу, – сказал он, вглядываясь в пол под ноги Дрона.
Дрон смутился, бегло взглянул на Алпатыча и опять опустил глаза.
– Ты вздор то оставь и народу скажи, чтобы собирались из домов идти в Москву и готовили подводы завтра к утру под княжнин обоз, да сам на сходку не ходи. Слышишь?
Дрон вдруг упал в ноги.
– Яков Алпатыч, уволь! Возьми от меня ключи, уволь ради Христа.
– Оставь! – сказал Алпатыч строго. – Под тобой насквозь на три аршина вижу, – повторил он, зная, что его мастерство ходить за пчелами, знание того, когда сеять овес, и то, что он двадцать лет умел угодить старому князю, давно приобрели ему славу колдуна и что способность видеть на три аршина под человеком приписывается колдунам.
Дрон встал и хотел что то сказать, но Алпатыч перебил его:
– Что вы это вздумали? А?.. Что ж вы думаете? А?
– Что мне с народом делать? – сказал Дрон. – Взбуровило совсем. Я и то им говорю…
– То то говорю, – сказал Алпатыч. – Пьют? – коротко спросил он.
– Весь взбуровился, Яков Алпатыч: другую бочку привезли.
– Так ты слушай. Я к исправнику поеду, а ты народу повести, и чтоб они это бросили, и чтоб подводы были.
– Слушаю, – отвечал Дрон.