Loading AI tools
Из Википедии, свободной энциклопедии
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>
void wait_thread (void);
void* thread_func (void*);
int main (int argc, char *argv[], char *envp[]) {
pthread_t thread;
if (pthread_create(&thread,NULL,thread_func,NULL)) return EXIT_FAILURE;
for (unsigned int i = 0; i < 20; i++) {
puts("a");
wait_thread();
}
if (pthread_join(thread,NULL)) return EXIT_FAILURE;
return EXIT_SUCCESS;
}
void wait_thread (void) {
time_t start_time = time(NULL);
while(time(NULL) == start_time) {}
}
void* thread_func (void* vptr_args) {
for (unsigned int i = 0; i < 20; i++) {
fputs("b\n",stderr);
wait_thread();
}
return NULL;
}
Пример использования потоков на языке C++:
#include <cstdlib>
#include <iostream>
#include <memory>
#include <unistd.h>
#include <pthread.h>
class Thread {
public:
int start () {
return pthread_create( &_ThreadId, nullptr, Thread::thread_func, this );
}
int wait () {
return pthread_join( _ThreadId, nullptr );
}
protected:
Thread() = default;
Thread(const Thread&);
virtual ~Thread () = default;
virtual void run () = 0;
static void* thread_func(void* d) {
(static_cast <Thread*>(d))->run();
return nullptr;
}
private:
pthread_t _ThreadId;
};
class TestingThread : public Thread {
public:
TestingThread (const char* pcszText) : _pcszText( pcszText ) {}
virtual void run () {
for (unsigned int i = 0; i < 20; i++, usleep(1000)) std::cout << _pcszText << std::endl;
}
protected:
const char* _pcszText;
};
int main (int argc, char *argv[], char *envp[]) {
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'. Основной поток ждёт завершения обоих дочерних потоков.
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.