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.
Пример использования потоков на языке 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'. Основной поток ждёт завершения обоих дочерних потоков.
Данная страница на сайте WikiSort.ru содержит текст со страницы сайта "Википедия".
Если Вы хотите её отредактировать, то можете сделать это на странице редактирования в Википедии.
Если сделанные Вами правки не будут кем-нибудь удалены, то через несколько дней они появятся на сайте WikiSort.ru .