Вход/Регистрация
QNX/UNIX: Анатомия параллелизма
вернуться

Цилюрик Олег Иванович

Шрифт:

// подвести итог ряда;

void operator !(void) {

mean /= (num - 1);

disp = sqrt(disp / (num - 1) - mean * mean);

}

}

// предварительное описание функции потока объекта

void* syncthread(void*);

class thrblock {

private:

static int code;

bool ok, st;

public:

pthread_t tid;

struct sigevent event;

timer_t timer;

int chid;

void* (*func)(void*);

sched_param param;

// структура только для статистики:

timestat sync;

// конструктор класса - он не только инициализирует структуру данных

// создаваемого объекта, но и запускает отдельный поток для его исполнения

thrblock(

// параметры конструктора

// - целевая функция последовательности

void (*dofunc)(void);

// - период ее синхронизации

unsigned long millisec;

// - приоритет возбуждения синхросерии

unsigned short priority;

// - копить ли статистику временных интервалов?

bool statist = false

) {

// создание канала для получения уведомлений от таймера

if (!(ok = ((chid = ChannelCreate(0)) >= 0))) return;

// создать соединение по каналу, которое будет использовать таймер

event.sigev_coid =

ConnectAttach(ND_LOCAL_NODE, 0, chid, NTO_SIDE_CHANNEL, 0);

if (!(ok = (event.sigev_coid >= 0))) return;

// занести целевую функцию, заодно выполнив

// трюк преобразования над ее типом

func = (void*(*)(void*))dofunc;

int policy;

// запомнить приоритет вызывающей программы

// под этим приоритетом и вызывать целевую функцию

pthread_getschedparam(pthread_self, &policy, &param);

st = statist;

event.sigev_code = code++;

event.sigev_notify = SIGEV_PULSE;

// а вот это приоритет, с которым нужно будет пробуждаться от таймера!

event.sigev_priority = priority;

// создание таймера

if (!(ok = (timer_create(CLOCK_REALTIME, &event, &timer) == 0))) return;

// запуск отдельного потока, который по сигналу

// таймера будет выполнять целевую функцию

if (!(ok = (pthread_create(&tid, NULL, &syncthread, (void*)this) == EOK)))

return;

// и только после этого можно установить период срабатывания

// таймера, после чего он фактически и запускается

struct itimerspec itime;

nsec2timespec(&itime.it_value, millisec * 1000000ull);

itime it_interval = itime.it_value;

if (!(ok = (timer_settime(timer, 0, &itime, NULL) == 0))) return;

}

// признак того, что объект создан успешно и его поток запущен:

bool OK(void) { return ok; }

bool statistic(void) { return st; }

};

int thrblock.code = _PULSE_CODE_MINAVAIL;

  • Читать дальше
  • 1
  • ...
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: