Создание многопоточных объектов
Модели делегирования, равноправных потоков, конвейера и типа «изготовитель» - «потребитель» предлагают деление программы на несколько потоков с помощью функций. При использовании объектов функции-члены могут создавать потоки выполнения нескольких задач. Потоки используются для выполнения кода от имени объекта: посредством отдельных функций и функций-членов.
В любом случае потоки объявляются в рамках объекта и создаются одной из функций-членов (например, конструктором). Потоки могут затем выполнять некоторые независимые функции (функции, определенные вне объекта), которые вызывают функции-члены глобальных объектов. Это — один из способов создания многопоточного объекта. Пример многопоточного объекта представлен в листинге 4.10.
// Листинг 4.11 . Объявление и определение многопоточного
// объекта
#include <pthread.h>
#include <iostream>
#include <unistd.h>
void *taskl(void *);
void *task2(void *);
class multithreaded_object {
pthread_t Threadl,
Thread2; public:
multithreaded_object(void);
int cl(void);
int c2(void);
//.. .
);
multithreaded_object::multithreaded_object(void) {
//. . .
pthread_create(&Threadl, NULL, taskl, NULL); pthread_create(&Thread2 , NULL, task2 , NULL);
pthread_join(Threadl, NULL);
pthread_join(Thread2 , NULL);
//. . .
}
int multithreaded_object::cl(void) {
// Выполнение действий,
return(1);
}
int multithreaded_object::c2(void) {
// Выполнение действий,
return(1);
}
multithreaded_object MObj;
void *taskl(void *) {
//...
MObj.cl() ; return(NULL) ;
}
void *task2(void *) {
//...
M0bj.c2(); return(NULL) ;
}
В листинге 4.11 в классе multithread_object объявляются два потока. Они создаются и присоединяются к основному потоку в конструкторе этого класса. Поток Thread1 выполняет функцию task1 (), а поток Thread2 — функцию task2 (). Функции taskl () и task2 () затем вызывают функции-члены глобального объекта MObj.
Больше книг — больше знаний!
Заберите 30% скидку новым пользователям на все книги Литрес с нашим промокодом
ПОЛУЧИТЬ СКИДКУ