PIP 5.9.0
Platform-Independent Primitives
Загрузка...
Поиск...
Не найдено
Класс PIThreadNotifier

Класс уведомления потоков для синхронизации между потоками. Подробнее...

#include <pithreadnotifier.h>

Открытые члены

void wait ()
 Начать ожидание, продолжает когда другой поток вызовет notify().
bool waitFor (PISystemTime timeout)
 Начать ожидание не дольше чем "timeout", возвращает true когда другой поток вызовал notify(), false если таймаут истек
void notify ()
 Уведомить один из ожидающих потоков, которые висят на методе wait().

Подробное описание

Класс уведомления потоков для синхронизации между потоками.

Класс для простого уведомления и ожидания в различных потоках

Каждый вызов notify() сохраняет одно ожидающее пробуждение. Последующий wait() или waitFor() потребляет одно сохраненное уведомление; при нескольких ожидающих потоках порядок возобновления не определен.

Краткий обзор

Этот класс используется как событийный механизм между потоками. Один поток ждёт некоторого события и другой его отправляет, разблокируя первый. Это полезно для синхронизации действий в нескольких потоках.

Использование

PIThreadNotifier notifier;
class Worker: public PIThread {
public:
Worker(const PIString & n) {
setName(n);
}
void run() override {
piCoutObj << (int)time.elapsed_m() << "wait ...";
notifier.wait();
piCoutObj << (int)time.elapsed_m() << "done";
};
};
int main(int argc, char * argv[]) {
PIVector<Worker*> workers;
// create 2 threads
for (auto n: {"first ", "second"})
workers << new Worker(n);
// start them
for (auto * w: workers)
w->startOnce();
piMSleep(500);
notifier.notify(); // notify one of them after 500 ms
piMSleep(500);
notifier.notify(); // notify one of them after 1000 ms
for (auto * w: workers)
w->waitForFinish();
}
// [Worker "first "] 0 wait ...
// [Worker "second"] 0 wait ...
// [Worker "second"] 500 done
// [Worker "first "] 1000 done
#define piCoutObj
Макрос для условного (piDebug && PIObject::debug()) вывода в PICout(StdOut) для наследников PIObject.
Определения picout.h:45
#define PIOBJECT_SUBCLASS(name, parent)
Поместите этот макрос внутрь объявления наследника PIObject, чтобы унаследовать зарегистрированные ме...
Определения piobject_macros.h:53
void setName(const PIString &name)
Устанавливает свойство name этого объекта.
Определения piobject.h:178
Класс строки.
Определения pistring.h:42
Объект потока, выполняющий работу в отдельном системном потоке.
Определения pithread.h:99
virtual void run()
Виртуальный метод, выполняемый на каждой итерации цикла, пока не запрошен останов.
Определения pithread.h:315
void wait()
Начать ожидание, продолжает когда другой поток вызовет notify().
Определения pithreadnotifier.cpp:109
void notify()
Уведомить один из ожидающих потоков, которые висят на методе wait().
Определения pithreadnotifier.cpp:139
Измерение времени.
Определения pisystemtime.h:456
double elapsed_m() const
Возвращает в милисекундах время, прошедшее с последнего вызова reset(), либо создания измерителя.
Определения pisystemtime.cpp:297
void piMSleep(double msecs)
Точно ожидает "msecs" миллисекунд
Определения pitime.h:41

Методы

◆ wait()

void PIThreadNotifier::wait ( )

Начать ожидание, продолжает когда другой поток вызовет notify().

Если ранее был вызван notify(), то возвращает управление немедленно.
Если ранее был вызван notify() "n" раз, то возвращает управление немедленно "n" раз, но только если ожидать одним потоком.
Если ожидают несколько потоков, и notify() был вызван "n" раз, то все потоки суммарно вернут управление "n" раз в неопределенной последовательности.

◆ notify()

void PIThreadNotifier::notify ( )

Уведомить один из ожидающих потоков, которые висят на методе wait().

Если ожидают несколько потоков, то уведомляет один случайный.
Если вызвать "n" раз, то все ожидающие потоки уведомятся суммарно "n" раз.