PIP 5.6.1
Platform-Independent Primitives
Открытые члены | Полный список членов класса
Класс PIThreadNotifier

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

#include <pithreadnotifier.h>

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

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

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

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

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

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

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

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

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

class Worker: public PIThread {
PIOBJECT_SUBCLASS(Worker, 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[]) {
// 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
Класс строки.
Definition: pistring.h:42
Объект потока, выполняющий работу в отдельном системном потоке.
Definition: pithread.h:99
Класс уведомления потоков для синхронизации между потоками.
Definition: pithreadnotifier.h:44
void wait()
Начать ожидание, продолжает когда другой поток вызовет notify()
Definition: pithreadnotifier.cpp:109
void notify()
Уведомить один из ожидающих потоков, которые висят на методе wait()
Definition: pithreadnotifier.cpp:139
Измерение времени.
Definition: pisystemtime.h:456
double elapsed_m() const
Возвращает в милисекундах время, прошедшее с последнего вызова reset(), либо создания измерителя.
Definition: pisystemtime.cpp:297
Последовательный контейнер с линейной памятью - динамический массив любого типа.
Definition: pivector.h:118
void piMSleep(double msecs)
Точно ожидает "msecs" миллисекунд
Definition: pitime.h:41

Методы

◆ wait()

void PIThreadNotifier::wait ( )

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

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

◆ notify()

void PIThreadNotifier::notify ( )

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

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