POSIX Threads | это... Что такое POSIX Threads? (original) (raw)

POSIX Threads — стандарт POSIX реализации потоков (нитей) выполнения, определяющий API для создания и управления ими.

Библиотеки, реализующие этот стандарт (и функции этого стандарта), обычно называются Pthreads (функции имеют приставку «pthread_»). Хотя наиболее известны варианты для Unix-подобных операционных систем, таких как Linux или Solaris, но существует и реализация для Microsoft Windows (Pthreads-w32)

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

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) { int i;

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

return NULL;

}

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

if (pthread_create(&thread, NULL, thread_func, NULL) != 0)
{
    return EXIT_FAILURE;
}

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

if (pthread_join(thread, NULL) != 0)
{
    return EXIT_FAILURE;
}

return EXIT_SUCCESS;

}

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

#include #include #include

#include <pthread.h>

class Thread { private: pthread_t thread;

Thread(const Thread& copy);         // copy constructor denied
static void *thread_func(void *d)   { ((Thread *)d)->run(); }

public: Thread() {} virtual ~Thread() {}

virtual void run() = 0;

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

};

typedef std::auto_ptr ThreadPtr;

int main(void) { class Thread_a:public Thread { public: void run() { for (int i=0; i<20; i++, sleep(1)) std::cout << "a " << std::endl; } };

class Thread_b:public Thread
{
public:
    void run()
    {
        for(int i=0; i<20; i++, sleep(1))
            std::cout << "  b" << std::endl;
    }
};

ThreadPtr a( new Thread_a() );
ThreadPtr b( new Thread_b() );

if (a->start() != 0 || b->start() != 0)
    return EXIT_FAILURE;

if (a->wait() != 0 || b->wait() != 0)
    return EXIT_FAILURE;

return EXIT_SUCCESS;

}

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

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

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

См. также

Ссылки