вівторок, 26 липня 2011 р.

Багатопоточність: boost.threads

Минулого століття програми, написані з використанням декількох потоків виконання, зустрічалися досить рідко. Сьогодні ж Інтернет-сервери запускають безліч потоків виконання, щоб ефективно обслужити безліч з'єднань з клієнтами. З метою максимізації пропускної здатності сервери транзакцій виконують свої сервіси в окремих потоках. Графічні програми роблять тривалі операції в окремому потоці, продовжуючи чітко реагувати на дії користувача. Цей список можна продовжувати і далі. Деякі програмісти, пишуть програми на C++, використовуючи бібліотеки, надані їх операційними системами і забезпечують системну підтримку потоків. Стандарт POSIX визначає підтримку многопоточ ності в бібліотеці, відомої як PTHREADS. Вона підтримує багатопоточність для широкого діапазону зона операційних систем, включаючи Win32 посредст вом порту pthreads-win32. Однак, це C-бібліотека, вона не реалізує деякі концепції C + +, вона не доступна на деяких платформах. Boost.Threads - бібліотека, призначається для вирішення проблем нестандартності та непереносимості. Boost - це організація, заснована членами робочої групи комітету з стандартизації C++ з ціллю розробки нових бібліотек для C++. На даний час в організацію входять приблизно 2000 членів. Безліч бібліотек можна знайти в дистрибютиві Boost (www.boost.org). Щоб зробити ці бібліотеки безпечними щодо потоків і була створена бібліотеку ка Boost.Threads. Багато експертів C++ внесли свій внесок в дизайн Boost.Threads. Інтерфейс бібліотеки був спроекті ваний з чистого аркуша і не є простою обгорткою якої-небудь багатопотокового API для C. Багато можливостей C++ (такі як існування конструкторів і деструкторів, функціональних об'єктів і шаблонов) були повною мірою використані з метою створення більш гнучкого інтерфейсу. Поточна реалізація працює на платформах POSIX, Win32 і Mac OS X.

Створення потоку

Класс boost::thread представляє потік виконання в тому сенсі, в якому std::fstream представляе файл. Конструктор за замовчуванням створює екземпляр, представляючий поточний потік виконання. Пере-завантажений конструктор приймає функціональнийоб'єкт, що викликається без аргументів і нічого не повертає. Цей конструктор запускає новий потік виконання, який в свою чергу викликає функціональний об'єкт. На перший погляд може здатися, що такий дизайн менш корисний, ніж типовий підхід мови C створення потоку, коли функції, що викликається новимпотоком, передається покажчик на void, за допомогою якого передаються дані. Однак, оскільки бібліотека Boost.Threads замість покажчика на функцію використовує функціональний об'єкт, саме він і може містити дані, необхідні потоку. Такий підхід, насправді, більш гнучкий і типобеспечний. Комбінуючи з функціональними бібліотеціками, такими як Boost.Bind, цей дизайн дозволяєлегко передавати новоствореному потоку будь які обсяги даних. В даний час з об'єктом потоку можна зробити не надто багато. Фактично, можна виконати тільки дві операції. Об'єкти потоків можналегко порівняти на рівність і нерівність, використовуючи операції == і ! =, щоб визначити, чи належать вони до одного і того ж потоку виконання, і можна дочекатися завершення потоку, викликаючи boost::thread::join. Інші потокові бібліотеки дозволяють виконувати над потоками та інші операції (наприклад, встановлювати його пріоритет або навіть зупиняти). Однак так як ці бібліотеки не дуже легко відобразити непереносимі інтерфейси, все ще проводяться дослідження, метою яких є додавання відповідних можливостей і в Boost.Threads. Наступний код демонструє дуже простий приклад використування класу boost::thread. Створюється новий потік, який просто виводить "Hello World" на std::cout, а основний потік чекає його завершення.

#include <boost/thread/thread.hpp>
#include <iostream>

void hello() {
std::cout<<"Hello, World\n";
}

int main() {
boost::thread thrd(&hello);
thrd.join();
}

Мютекси

Кожен, хто писав багатопотокову програму, розуміє, наскільки важливо безлічі потоків не звертатися до одного й того ж ресурсу, в один і той же час. Якщо один потік намагається змінити значення розділяних даних в той час, коли інший потік намагається це значення прочитати, результатом буде невизначена поведінка. Щоб цьому запобігти, використовують деякі спеціальні примітивні типи і операції. Самий фундаментальний з цих типів відомий як мютекс (Скорочення від «mutual exclusion» - взаємне виключення). Мютекс дозволяє отримати доступ до роздільного ресурсу тільки одному потоку в один момент часу, цей потік повинен «заблокувати» мютекс. Якщо інший потік вже заблокував мютекс, то ця операція чекає, поки мютекс не буде звільнений («Розблоковано»), таким чином гарантується, що тільки один потік має доступ до роздільного ресурсу в один момент часу. Мютекс може мати кілька варіацій. Дві великі категорії підтримуваних бібліотекою Boost.Threads мютекс включають прості і рекурсивні мютекси. Простий мютекс може бути заблокований лише один раз. Спроба повторного захоплення мютекса призводить до глухого кута, що виражається в нескінченному очікуванні. При використанні рекурсивного мютекса один потік може заблокувати мьютекс кілька разів і має рівно стільки ж разів його розблокувати, перш ніж інший потік отримає можливість його заблокувати. У рамках цих двох великих категорій мютекс виділяють і інші способи блокування мютекса. Потік може спробувати заблокувати мютекс трьома способами:
  1. Спробувати заблокувати мютекс, очікуючи поки жоден інший потік не буде ним володіти.
  2. Спробувати заблокувати мютекс, негайно але повернувшись, якщо цей мьютекс вже кимось заблокований.
  3. Спробувати заблокувати мютекс, очікуючи або його звільнення іншим потоком, або закінчення зазначеного періоду часу.
Найкращим можливим типом мютекса є рекурсивний мютекс, підтримуючий всі три форми блокування. Однак з кажною варіацією додаються накладні витрати, тому бібліотека Boost.Threads передбачає можливість вибору найбільш ефективного виду мьютекса для кожного конкретного випадку. Таким чином, є шість типів мютексів, перерахованих тут в порядку зниження ефективності:
  • boost::mutex
  • boost::try_mutex
  • boost::timed_mutex
  • boost::recursive_mutex
  • boost::recursive_try_mutex
  • boost::recursive_timed_mutex
Тупики можуть трапитися всякий раз, коли мютекс заблоковано і вчасно не звільнено. Це одна з найпоширеніших помилок, тому бібліотека Boost.Threads спроектована так, щоб зробити її неможливою (або, принаймні, важко реалізуємою). Немає жодної безпосередній операції по блокування або розблокування мютекса. Замість цього класи мьютекс надають визначення ня типів (typedef), які реалізують ідіому RAII (Re- source Acquisition is Initialization - Захоплення ресурсу є ініціалізацією) для блокування і Розблокування мютекса. Ця ідея відома як патерн «Блокування в області видимості» (Scoped Lock). При створенні об'єкту такого типу йому передається посилання на мьютекс. Конструктор блокує мютекс, а деструктор розблокує його. Правила мови C++ гарантують, що деструктор завжди буде викликаний, так що навіть якщо викинуто виключення, мютекс завжди буде коректно розблокований. Цей патерн допомагає гарантувати правильне використання мютекса. Проте, потрібно бути готовим до того, що хоча мютекс виявиться Розблокованим, не факт, що кожен розділяється ресурс опиниться в коректному стані в разі виникнення винятку. Тому, як і у випадку з одним потоком виконання, слід щоразу переконуватися в тому, що виключення не призводять до порушення цілісності стану програми. Крім того, об'єкти блокувань не повинні передаватися іншим потокам, так як їх стан не захищений при такому використанні. У наступному прикладі показано дуже просте використання класу boost::mutex. Створюються два нових потоки, кожний з них 10 раз виводить свій id і лічильник циклу, а основний потік чекає їх завершення. Об'єкт std::cout є ресурсом, тому кожен потік використовує глобальний мютекс, гарантуючий, що тільки один потік в кожен момент часу намагається здійснювати виведення.

#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <iostream>
boost::mutex io_mutex;
struct count {
count(int id) : id(id) {}
void operator()() {
for (int i = 0; i < 10; ++i) {
boost::mutex::scoped_lock
lock(io_mutex);
std::cout<<id<< ": "<<i<<std::endl;
}
}
int id;
};
int main(int argc, char* argv[]) {
boost::thread thrd1(count(1));
boost::thread thrd2(count(2));
thrd1.join();
thrd2.join();
return 0;
}
Багато користувачів помітять, що передача даних потоку вимагає ручного кодування функціонального об'єкта. Хоча цей код і тривіальний, писати його кожного разу досить нудно. Є й більш просте рішення. Функціональні бібліотеки дозволяють створити нові функціональні об'єкти, пов'язуючи (bind) інші функціональні об'єкти з даними, які при виклику будуть їм передані. У наступному прикладі показано, як при використанні бібліотеки Boost.Bind можна спростити код попереднього прикладу прикладу, відмовившись від ручного кодування функціонального об'єкта.

/**
  *Ця програма ідентична програмі
  *з попереднього прикладу, крім того, що
  *використовує Boost.Bind
  *при створені потоку,
  *що приймає параметры.
*/
#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/bind.hpp>
#include <iostream>
boost::mutex io_mutex;
void count(int id) {
for (int i = 0; i < 10; ++i) {
boost::mutex::scoped_lock
lock(io_mutex);
std::cout<<id<<": "<<i<<std::endl;
}
}
int main(int argc, char* argv[]) {
boost::thread thrd1(
boost::bind(&count, 1));
boost::thread thrd2(
boost::bind(&count, 2));
thrd1.join();
thrd2.join();
return 0;
}

Умовні змінні

Іноді недостатньо просто встановити блок і скористатися роздільним ресурсом. Іноді необхІдно, щоб цей ресурс перед використанням знаходився в деякому спеціальному стані. Наприклад, потік може намагатися витягти дані з стека, чекаючи, коли в ньому вони з'являться, якщо в цей момент стек порожній. Для реалізації такого виду синхронізації, мьютекса недостатньо. У такому разі можна використовувати інший механізм синхронізації, відомий як умовна змінна. Умовна змінна завжди використовується в зв'язці з мьютексом та ресурсом (або ресурсами). Потік насамперед блокує мьютекс, а потім перевіряє, чи знаходиться ресурс в стані, що дозволяє його безпечне використання необхідним чином. Якщо він не в потрібному стані, потік викликає для умовної змінної операцію очікування. Ця операція призводить до розблокування мьютекса під час очікування, так що інший потік отримує можливість змінити стан роздільного ресурсу. Вона також гарантує, що при поверненні потоку після очікування мьютекс виявиться заблокованим. Коли інший потік змінює стан поділюваного ресурсу, він має повідомити потоки, які можуть чекати умовну змінну, дозволити їм завершити очікування. Наступний приклад ілюструє застосування класу boost::condition. Визначено клас, який реалізує обмежений буфер - контейнер фіксованого розміру з підтримкою введення/виводу в порядку черги (FIFO). Цей буфер зроблений потокобезпечним завдяки boost::mutex. Операції put і get використовують умовну змінну, щоб переконатися в тому, що потік буде чекати, поки буфер не опиниться в стані, необхідному для завершення операції. Створюються два потоки, один поміщає в цей буфер сто цілих, а інший їх же витягує. Обмежений буфер в кожен момент часу може містити тільки 10 цілих, тому кожному з потоків доводиться періодично чекати інший потік. Для перевірки того, що це дійсно відбувається, операції put і get виводять в std::cout діагностичні повідомлення. Нарешті, основний потік чекає завершення обох потоків.

#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition.hpp>
#include <iostream>
const int BUF_SIZE = 10;
const int ITERS = 100;
boost::mutex io_mutex;
class buffer
{
public:
typedef boost::mutex::scoped_lock
scoped_lock;

buffer() : p(0), c(0), full(0) {}

void put(int m)
{
scoped_lock lock(mutex);
if (full == BUF_SIZE)
{
{
boost::mutex::scoped_lock
lock(io_mutex);
std::cout <<
"Buffer is full. Waiting..."
<< std::endl;
}
while (full == BUF_SIZE)
cond.wait(lock);
}
buf[p] = m;
p = (p+1) % BUF_SIZE;
++full;
cond.notify_one();
}
int get()
{
scoped_lock lk(mutex);
if (full == 0)
{
{
boost::mutex::scoped_lock
lock(io_mutex);
std::cout <<
"Buffer is empty. Waiting..."
<< std::endl;
}
while (full == 0)
cond.wait(lk);
}
int i = buf[c];
c = (c+1) % BUF_SIZE;
--full;
cond.notify_one();
return i;
}

private:
boost::mutex mutex;
boost::condition cond;
unsigned int p, c, full;
int buf[BUF_SIZE];
};
buffer buf;
void writer()
{
for (int n = 0; n < ITERS; ++n)
{
{
boost::mutex::scoped_lock
lock(io_mutex);
std::cout << "sending: "
<< n << std::endl;
}
buf.put(n);
}
}
void reader()
{
for (int x = 0; x < ITERS; ++x)
{
int n = buf.get();
{
boost::mutex::scoped_lock
lock(io_mutex);
std::cout << "received: "
<< n << std::endl;
}
}
}

int main(int argc, char* argv[])
{
boost::thread thrd1(&reader);
boost::thread thrd2(&writer);
thrd1.join();
thrd2.join();
return 0;
}

Локальна пам'ять потоку

Багато функцій не розраховані на рентабельність. Це означає, що небезпечно викликати таку функцію в момент, коли її викликає інший потік. Нереентерабельні функції зберігають статичні дані між успішними викликами або повертають покажчик на статичні дані. Наприклад, функція std::strtok нереентерабельна, оскільки використовує статичні дані для зберігання рядка, що розбивається на токени. Така функція може бути зроблена реєнтерабельним за допомогою двох підходів. Один підхід полягає в зміні її інтерфейсу, так що функція приймає покажчик або посилання на тип даних, який можна використовувати замість використовуваної перш статичної області даних. Наприклад, стандарт POSIX визначає strtok_r, реєнтерабельним версію std::strtok, яка приймає додатковий параметр типу char**, що використовується замість статичної пам'яті. Це просте рішення, до того ж воно забезпечує найбільшу можливу продуктивність, а проте, воно означає зміну відкритого інтерфейсу, що потенційно може призвести до зміни великого обсягу коду. Другий підхід залишає інтерфейс без зміни і замінює статичну пам'ять на локальну пам'ять потоку (thread local storage) (іноді її називають потік-специфічною пам'яттю thread-specific storage). Локальна пам'ять потоку - це дані, пов'язані з конкретним (поточним) потоком. Багатопотокові бібліотеки надають доступ до локальної пам'яті потоку за допомогою інтерфейсу, що дозволяє отримати доступ до екземпляра даних, що належать поточному потоку. Кожен потік отримує свій власний екземпляр цих даних, тобто тут не виникає проблема спільного доступу. Однак, доступ до локальної пам'яті потоку повільніший, ніж до локальних або статичних данних, так що це не завжди найкраще рішення. Тим не менш, це єдине можливе рішення в разі, коли зміна відкритого інтерфейсу неприйнятна. Бібліотека Boost.Threads забезпечує доступ до локальної пам'яті потоку за допомогою «розумного» покажчика (smart pointer) boost::thread_specific_ptr. При першому зверненні кожного потоку до цього «розумному» вказівником, він має нульове значення, так що код повинен перевірити цей факт і забезпечити ініціалізацію покажчика при першому використанні. Бібліотека Boost.Threads гарантує, що дані, які зберігаються в локальній пам'яті потоку, будуть «зачищені» при виході з потоку. Наступний приклад ілюструє дуже просте застосування класу boost::thread_specific_ptr. Створюються два потоки, в них ініціалізується локальна пам'ять потоку, а потім у циклі 10 разів значення цілого, розташованого за адресою «розумного» покажчика інкрементується, а результат виводиться в std::cout (який синхронізований за допомогою мьютекса, так як є роздільним ресурсом) . Основний потік чекає завершення цих двох потоків. Висновок в цьому прикладі ясно показано, що кожен потік оперує зі своїм екземпляром даних, хоча обидва вони використовують один і той же boost::thread_specific_ptr.

#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/tss.hpp>
#include <iostream>
boost::mutex io_mutex;
boost::thread_specific_ptr<int> ptr;
struct count
{
count(int id) : id(id) { }
void operator()()
{
if (ptr.get() == 0)
ptr.reset(new int(0));
for (int i = 0; i < 10; ++i)
{
(*ptr)++;
boost::mutex::scoped_lock
lock(io_mutex);
std::cout << id << ": "
<< *ptr << std::endl;
}
}
int id;
};
int main(int argc, char* argv[])
{
boost::thread thrd1(count(1));
boost::thread thrd2(count(2));
thrd1.join();
thrd2.join();
return 0;
}

Одноразові функції

Залишається розібратися з одним питанням: як зробити функції ініціалізації (такі як конструктори) потокобезпечна. Наприклад, коли «глобальний» екземпляр об'єкта створюється як сінглетон рівня програми (єдиний існуючий з програми такого типу), існує проблема порядку інстанціюванія, тому використовується функція, яка повертає статичний екземпляр, яка гарантує, що при першому зверненні до неї цей екземпляр буде створений. Проблема в тому, що якщо кілька потоків одночасно викличуть цю функцію, конструктор для статичного об'єкта також може бути викликаний кілька разів, і результати можуть виявитися поганими. Рішення проблеми в так званих «одноразові функції» (once routine). Така функція викликається в програмі тільки один раз. Якщо кілька потоків спробують її викликати одночасно, тільки один з них отримає таку можливість, а в цей час всі інші потоки будуть чекати, поки виконання функції не завершиться. Щоб гарантувати однократне виконання, така функція викликається побічно через іншу функцію, якій передається покажчик на вихідну і посилання на спеціальний прапор (flag), що сигналізує про факт виклику функції. Цей прапор ініціалізується статично, що гарантує ініціалізацію в період компіляції, а не в період виконання. І таким чином не представляє проблеми для багатопотокової ініціалізації. Бібліотека Boost.Threads надає можливість одноразового виклику функції за допомогою boost::call_once, а також визначає тип для прапора boost::once_flag і спеціальну макропідстановку, використовувану для статичної ініціалізації прапора, BOOST_ONCE_INIT. Наступний приклад показує дуже простий приклад використання boost::call_once. Глобальне ціле статично ініціалізується нулем, а примірник boost::once_flag статично ініціалізується за допомогою BOOST_ONCE_INIT. Основний потік запускає два потоки, кожен з яких намагається «ініціалізувати» глобальне ціле, викликаючи boost::call_once з покажчиком на функцію, інкрементуючу ціле. Потім основний потік чекає завершення обох потоків і виводить кінцеве значення цілого в std::cout. Висновок демонструє, що функція дійсно була викликана тільки одного разу, так як значення цілого - одиниця.

#include <boost/thread/thread.hpp>
#include <boost/thread/once.hpp>
#include <iostream>
int i = 0;
boost::once_flag flag = BOOST_ONCE_INIT;
void init() {
++i;
}
void thread() {
boost::call_once(&init, flag);
}
int main(int argc, char* argv[]) {
boost::thread thrd1(&thread);
boost::thread thrd2(&thread);
thrd1.join();
thrd2.join();
std::cout << i << std::endl;
return 0;
}

52 коментарі:

  1. You truly ensure it is show up very easy with your powerpoint presentation,
    even so feel getting this particular topic being essentially another thing that
    we experience We would certainly not realize.
    It seems as well intricate and also substantial to me.
    I’m writing about forwards on the up coming site, I'm going to seek to purchase the suspend than me!
    My weblog :: Online Vehicle Insurance

    ВідповістиВидалити
  2. My partner and I absolutely love your blog and find
    nearly all of your post's to be what precisely I'm looking for.
    Would you offer guest writers to write content in your case?
    I wouldn't mind composing a post or elaborating on most of the subjects you write with regards to here. Again, awesome web site!

    Also visit my web site: galore

    ВідповістиВидалити
  3. Hi there. I noticed your blog title, "Blogger: c++ програмування" doesn't really reflect the content of your website. When composing your site title, do you think it's best to write it for Website positioning
    or for your viewers? This is something I've been battling with simply because I want great search rankings but at the same time I want the best quality for my site visitors.

    My blog post :: bicycle

    ВідповістиВидалити
  4. Wow that was unusual. I just wrote an extremely long
    comment but after I clicked submit my comment didn't appear. Grrrr... well I'm not writing all that
    over again. Anyway, just wanted to say excellent blog!


    My web site: adaptable

    ВідповістиВидалити
  5. Hey! I realize this is kind of off-topic however I had to ask.
    Does managing a well-established website like yours require a lot of work?
    I am completely new to running a blog however I do write in my journal everyday.
    I'd like to start a blog so I can share my personal experience and feelings online. Please let me know if you have any kind of recommendations or tips for brand new aspiring bloggers. Thankyou!

    Feel free to surf to my site: concretenetwork

    ВідповістиВидалити
  6. Hello this is somewhat of off topic but I was wanting to know if blogs use WYSIWYG editors or if you
    have to manually code with HTML. I'm starting a blog soon but have no coding expertise so I wanted to get guidance from someone with experience. Any help would be greatly appreciated!

    Also visit my website - action stump

    ВідповістиВидалити
  7. Hello there! Do you know if they make any plugins to help with Search Engine Optimization?
    I'm trying to get my blog to rank for some targeted keywords but I'm not seeing very good gains.
    If you know of any please share. Many thanks!


    My web blog; pakerice
    my web site :: oprema

    ВідповістиВидалити
  8. Doh! I was domain name searching at namecheap.com and went to type in the domain name: http:
    //www.blogger.com/comment.g?blogID=3014159115161912678&postID=2291661119488132325 and guess
    who already had it? You did! haha j/k. I was about to buy this domain name but realized it had been taken so I decided I'd come check it out. Good blog!

    Look into my web blog; instructions

    ВідповістиВидалити
  9. The other day, while I was at work, my sister stole my iphone and tested to see if it
    can survive a 25 foot drop, just so she can be a youtube sensation.

    My iPad is now broken and she has 83 views. I know this is entirely off topic but I had to
    share it with someone!

    ВідповістиВидалити
  10. I'm curious which blogging and site-building platform you might be using? I'm new to operating a blog and
    have been thinking about using the Quizilla
    platform. Do you think this is a good foundation to start with?
    I would be really grateful if I could ask you some questions through email so I can learn a bit more before getting started.
    When you have some free time, please be sure to get in touch with me at:
    sybildupre@freenet.de. Thank you

    Review my weblog ... stumps

    ВідповістиВидалити
  11. I don't know if it's just me or if everyone else experiencing issues with your blog.
    It looks like some of the text on your content
    are running off the screen. Can somebody else please comment and let me know if this
    is happening to them too? This might be a problem with my internet browser because I've had this happen before. Many thanks

    Also visit my weblog dekorativno
    Also see my website > profesionalna

    ВідповістиВидалити
  12. Amazing! I'm genuinely enjoying the design of your blog. Are you using a custom template or is this readily available to all users? If you don't
    want to say the name of it out in the public, please
    contact me at: justin_foss@gmail.com. I'd really enjoy to get my hands on this template! Thanks.

    My page: http://www.newhavenchurch.org/?document_srl=2961
    Also see my web page - datingsite-free.com

    ВідповістиВидалити
  13. It's a shame you don't have a donate button! I'd most certainly donate to this excellent blog! I guess for now i'll settle for bookmarking
    and adding your RSS feed to my Google account. I look forward to fresh updates and will share this website with my Facebook group.
    Talk soon!

    Here is my webpage ... folije

    ВідповістиВидалити
  14. Hey there fantastic website! Does running a blog like
    this require a large amount of work? I've no knowledge of coding but I had been hoping to start my own blog soon. Anyway, if you have any suggestions or techniques for new blog owners please share. I know this is off subject nevertheless I simply needed to ask. Appreciate it!

    Feel free to surf to my webpage :: information

    ВідповістиВидалити
  15. Hi. I am wondering if you might be interested in doing a link exchange?
    I notice your blog: http://www.blogger.com/comment.
    g?blogID=3014159115161912678&postID=2291661119488132325 and my website
    are structured around the same topic. I'd really like to swap links or perhaps guest author a article for you. Here is my personal email: isaac_connolly@zoho.com. Please be sure to contact me if you're even remotely interested.
    Thank you.

    Feel free to surf to my blog; comp
    Also see my web page: site

    ВідповістиВидалити
  16. I always spent my half an hour to read this weblog's content everyday along with a cup of coffee.

    Also visit my web blog - miumiu アウトレット

    ВідповістиВидалити
  17. We fundamentally need finances like for information repair your
    domicile or perhaps vehicle, dwelling rent payments, and even antic repaymants.
    As the header suggests fast cash loans are conceived to aid those grouping who lining business enterprise
    situation oft.

    my blog post pay day

    ВідповістиВидалити
  18. At this time it sounds like Movable Type is the top blogging platform available right
    now. (from what I've read) Is that what you're using on your blog?


    Feel free to visit my weblog: cellulite treatment

    ВідповістиВидалити
  19. Saνеd as а fаvοrіtе, I like your sitе!


    Feel free to νiѕit mу web page - imaginalmission.net

    ВідповістиВидалити
  20. Hello, I am new to running a blog and internet sites in general and was wanting
    to know how you got the "www" included in your
    domain name? I see your domain name, "http://www.blogger.com/comment.g?blogID=3014159115161912678&postID=2291661119488132325"
    has the www and my domain looks like, "http://mydomain.com".
    Do you know the simplest way I can alter this?
    I'm using Wordpress platform. Thanks for your time

    Feel free to surf to my site; Removal stump

    ВідповістиВидалити
  21. Would you mind if I quote a several of your articles or blog posts
    as long as I provide credit and sources
    back to your blog: http://www.blogger.com/comment.
    g?blogID=3014159115161912678&postID=2291661119488132325.
    I most certainly will aslo ensure to give you the appropriate anchortext
    hyperlink using your blog title: Blogger: c++ пр
    ограмува
    ння. Be sure to let me know if this is ok with
    you. Many thanks

    Have a look at my web page :: removing

    ВідповістиВидалити
  22. Do you have any vіdеο οf that?
    I'd want to find out more details. creating a website how to make a website

    ВідповістиВидалити
  23. Hey. I'm sorry to trouble you but I ran across your web site and discovered you are using the exact same theme as me. The only issue is on my website, I'm unable to get the layout looking like yours.
    Would you mind contacting me at: fredmaynard@arcor.
    de so I can get this figured out. By the way I have bookmarked your web-site:
    http://www.blogger.com/comment.g?blogID=3014159115161912678&postID=2291661119488132325 and will be visiting
    frequently. Many thanks!

    Here is my page: luggage canada

    ВідповістиВидалити
  24. Fоr more detaіleԁ informatіon on thе neω inѕurance marκetplace
    and helpful іnfoгmаtion on fіlling out the appliсation, go to:
    . Τo help familiеѕ wіthin NOVA І supрort President Obama's strategy to expand the child and Dependent Care Tax Credit to help provide relief for parents and care givers. The best place to begin is the internet where it will be easier to compare between all the sites and get some quotes too.

    Feel free to visit my page ... Do Children Need Private Health Insurance

    ВідповістиВидалити
  25. Such a ρlan would сοver you and
    your fаmily in thе event there iѕ а ωaіting реrіod that
    yοur new employeг requireѕ before you сan bе аdԁed to thеir gгοuρ plan.
    dοnt undеrstanԁ thе slow rоll of ροpulаtiοn contгol has hit on Obama's watch. You can make a choice of a plan based upon the coverage required and the benefits offered.

    Feel free to visit my web page: health insurance

    ВідповістиВидалити
  26. If you land on a wгong health insurance plan, it іs wοrѕe
    than not hаving health insurаnce cοveгage since you are a t a
    loss by paуing for something that does nοt
    гeally hеlp you. As only οnе еxample,
    Wаlgгеenѕ offeгѕ а
    сlub thаt аlloωs cuѕtomeгs to sаve on
    prescгіption drugs if they aгe not enrolled in Medicаre ог Mеԁicaid, and
    you can геaԁ about it on thе comрany site.
    Ιt is advised to ѕelеct wisely from the availablе сhoice.


    Mу web site ... individual health insurance plan

    ВідповістиВидалити
  27. Оnce thesе questions агe answeгed it would be
    helрful and it would аlѕo provide you an
    overviеw about the ԁіfferent aspectѕ.
    There are many pеoplе whο inѕіst their doсtors to
    kеep them in the hοspital fоr at least 24 hour,
    so that thеy can get theiг medical claim.
    Everything іs done onlinе, аnԁ уou
    cаn genегate leads ωhеn уou're not working.

    My blog private health insurance

    ВідповістиВидалити
  28. t take іt tο the vet for regulaг checkups the problem
    may neѵer be diѕcovered. As Ι literally
    flеd the building, it cгoѕsed my mind that Ι
    cоuld have colon cancer. The insurerѕ must mеet state licensing rеquiгements and their
    plans as well as pricing gοes thгu a state гun approval proсeѕѕ.



    My ωeb-site; Blackmen.cwsurf.de

    ВідповістиВидалити
  29. It is the оnly tool that is deemed to be helpful in seeking the quality medical treatment without any finanсial hasѕle.
    Use of the carriеr’s РPO network also рrοvіdes
    the Texas сonsumer with some oveгlooked benefits.
    It iѕ importаnt tο keep in mind that
    this law may not aрplу to smaller health insurance comρaniеѕ oг indiviԁual inѕurance ρlans.


    my web site: health insurance uk

    ВідповістиВидалити
  30. Sinсe, heаlth insuгance is one of the biggeѕt concerns, it іs neceѕsary thаt you find an affoгdаble hеаlth insurance with apρгopriatе heаlth insurancе
    quote for yοur familу members or employees.

    When сaгrіeԁ out right, the heаlth insurancе quotes you'll get facilitates easy private health insurance comparison, providing much better coverage at lower premiums saving you money and time. By using the card mentioned, you can land the Health Spending Account, which will often cover every penny of the remaining charge.

    Feel free to visit my web-site: online health Insurance quotes

    ВідповістиВидалити
  31. rosacea laser treatment Newton Upper Falls

    Check out my page ... rosacea doctor Murray

    ВідповістиВидалити
  32. Health Benefits of each Green-Fruіt Juice Ingredients:.
    At Ρhoenіx health insurance, уοu aгe cοvered from any typе of sіcknеss exρensеs by giving your mediсаl bills frοm
    where you агe а getting treаtment.
    By ԁοing this, be assurеԁ that уou will definitely get the
    health іnsurance plan that perfectly fits you.


    Feel free to visit my wеb blog private health insurance uk

    ВідповістиВидалити
  33. An important point to rеmеmber when deciding whetheг
    to go to a priѵate оf publiс exchangе are thе tax subsidies.
    Taking a health insuranсe coѵer ωill lead
    to a lifestyle thаt makes уou feel moved to have youг checκ
    up more oftеn. In this еxаmple her totаl
    out-of-pocket expense (deductible рlus heг
    share of coinsuгance) iѕ $1,200 ($1,000 deductible and $200 сoinsuгance).


    Alsο visit my sіte - malikov.com

    ВідповістиВидалити
  34. Α PPO (preferred proνiԁer oгganization) has a network fгоm whiсh you chοoѕe fгom,
    anԁ they let уou use ѕerѵices out οf nеtωorκ, but charge a feе.
    You must haνе often wondered why уou nееd heаlth insurance.
    We hаѵe fіgurеԁ out some of the сritical shortcomings in our rеsеarch report.


    Feеl free tο surf tо my wеblog; what is health insurance

    ВідповістиВидалити
  35. Α Las Vegaѕ health іnѕuranсe broker that рarticiρаtes in аn internet site that ωill alloω you to exрlore the ρlans
    as well аs ѕee the bеnefits ωіll be veгу helpful.
    Seconԁ question to ask is, 'What is the current and anticipated coverage or need of my household. The market scenario, drivers, and trends, and competitive landscape covered in the report would enable clients to understand the market structure and accordingly formulate future growth prospects.

    Also visit my web site ... www.F1newstoday.com

    ВідповістиВидалити
  36. Үou get thе basic rеtirement pensіon but not thе
    earnings relаted pеnsion. This is actually higher than
    the pгevious estimate of 4 milliоn whiсh the СBO had made last August (the difference between the two estіmates is
    due to reсent changeѕ in thе mаrginal tax rateѕ rathеr than Obamacaгe itѕelf).
    In short, the insured has given up thе ability to choοsе thеiг doсtor іn
    return for a minimаl decrеasе in insuгancе premіums.


    Herе is my web page: health insurance uk

    ВідповістиВидалити
  37. Whilе іnvestіng in anу inѕurance рlаn onе hаs tо be quite carеful eѕρeciallу when іt сomes to аnyone's life. By comparing the building insurance quotes online you can increase the chances of getting a best coverage that will give you maximum protection and provide a great peace of mind. Probably , you have just retired and is seeking out an extra insurance plan.

    Also visit my web-site: tales.namco.com

    ВідповістиВидалити
  38. Reliance Health Ӏnsuгance iѕ a геnoωned nаme in thе health insurancе industry and caters to the
    heаlth insuranсе nееԁѕ of the іnԁividuals and familiеs.
    You can receіve thеse Рaгt А anԁ Paгt B Meԁicагe benеfіtѕ through prіvate Flοгiԁа Heаlth Insuranсe Planѕ callеd Mediсare Advantage Ιnsuranсe.
    The amount of the coinѕurance maxіmum gеnerally
    rаnges fгom $2,000 to $3,000 per person, deρenԁіng on the plan,
    although lіmitѕ аs low аs $1,000 aгe sometіmeѕ aνаilablе.


    my web blog ... individual health care insurance

    ВідповістиВидалити
  39. Sincе brokers are more famіliar ωith all the ρlanѕ
    out there, they have an easier tіme findіng a plan that is geared toωard
    your needs. You shοuld not only consider the cost while analуzing the
    polіcy but also take in the conѕіderation thе features ωhich suit your prеsent
    and future requirements. Thеre сan bе
    а lot οf wоrk involved in setting up a group health
    ρlan.

    Reѵiew my web-sitе ... blackmtv.com

    ВідповістиВидалити
  40. This job may be get hold of speedy pecuniary resource correct in your checking business relationship.

    For winning the help of this loan aid you will not have
    to go direct protracted operation and irksome or any records for obtaining this
    wealth. The speedy loans same day ranges from
    L80 same day no assets bank cheque in the existing days.
    The borrowers should have enduring job do not know active
    computers and the Internet. Would you like to get fast cash
    with term that does not request any indirect. Payday loans bad
    assets are a mixture of day loans offered as the time period is quite a cozy that is distinct by the wealth
    lenders. Urgent day loans will help you to deal
    with your many truncated term expenses like profitable to day problems
    that may rise due to cash insufficiency. payday loansOne can au fond also assume content from Banks or else at that place in reality are and used for
    pinch purposes. You should demonstrate that you are having a good sum of currency
    of monetary system compelled, and then only your loan postulation
    will be apbed. If you are wretched from fiscal situation then
    you will debt, peculiarly when your financial gain is next to
    nil. Now, once you got this fast medium of exchange help then you can
    overwhelmed any commercial enterprise occasion such any
    assets checks from the investor.

    ВідповістиВидалити
  41. Some requirements your studies then come to
    Loans For Education. In instantaneous day loans, no fast cash site if
    this business concern is a loan securities firm organisation with bigeminal lenders available.

    Does it pay these advances through with net as well.
    payday loansAll that is necessary is some basic content such as need
    medium of exchange to meet all your postulatements.
    To helpfulness these loans as fast as possible, state of commercial
    enterprise state of affairs. This all depends upon the
    recipient leader for past few months and at that place should be a legal
    bank checking report in your name. It can be a hard-bitten taxable
    to broach, but you will frequently lets you clear any bill of
    electricity, water, medical or even any andifferent state of affairs.

    On the ansome different hand, entrepreneurs acquire
    the sum of money for transportation any file containing
    your documents. A azygos postulation form is needed to are canonical the
    same day of request. Take your most sure associate of force
    need to fill elemental online request forms.

    ВідповістиВидалити
  42. Hey! I simply saw another message in another blog that regarded like this.

    How do you know all this stuff? That’s one cool post.

    Also visit my webpage i'm having trouble getting pregnant

    ВідповістиВидалити
  43. Amazing! This blog looks just like my old one! It's on a entirely different subject but it has pretty much the same page layout and design. Great choice of colors!

    Look at my website ... pharmacy technician course

    ВідповістиВидалити
  44. I have read so many content regarding the blogger lovers however this piece of writing is in fact
    a pleasant post, keep it up.

    Also visit my website anti cellulite treatment

    ВідповістиВидалити
  45. Aw, this was a very good post. Taking a few minutes and actual
    effort to produce a really good article… but what can I say… I procrastinate a lot
    and never manage to get nearly anything done.



    my web site new cellulite treatment

    ВідповістиВидалити
  46. She might worship Buddha, God, the law and get a girlfriend
    themselves to take care of me. So, why does" being yourself" get a girlfriend?
    His get a girlfriend would be comforting offering a hug,
    kiss and she would go out of your way to getting her back and learn a bit more flirty, possessive and
    protective of her. The very first thing to do,
    because that's exactly what I'm going for - nothing shorter
    than the best. If you sense things might get a great
    meal out of the city.

    My web site; web page

    ВідповістиВидалити
  47. Hey just wanted to give you a quick heads up. The words in your
    article seem to be running off the screen in Chrome.
    I'm not sure if this is a formatting issue or something to do with web browser compatibility but I figured I'd post to let
    you know. The design look great though! Hope you get the problem solved soon.

    Thanks

    Stop by my web-site home cellulite treatment

    ВідповістиВидалити
  48. You need to be a part of a contest for one of the finest sites on the internet.
    I most certainly will recommend this site!

    Here is my blog post ... natural cellulite treatment

    ВідповістиВидалити
  49. I think this is one of the most important information for me.
    And i am glad reading your article. But should remark on some
    general things, The site style is wonderful, the articles is really great :
    D. Good job, cheers

    Check out my blog ... bail Bonds las vegas

    ВідповістиВидалити
  50. I'm new to developing internet sites and I was wondering if having your site title relevant to your articles and other content really that vital? I see your title, "Blogger: c++ програмування " does appear to be spot on with what your website is about but, I prefer to keep my title less content descriptive and based more around site branding. Would you think this is a good idea or bad idea? Any kind of assistance would be greatly valued.

    my weblog luggage storage paris ()

    ВідповістиВидалити
  51. I think that everything posted was actually very reasonable.
    However, consider this, what if you composed a catchier title?

    I mean, I don't wish to tell you how to run your blog, however what if you added a title that makes people desire more? I mean "Багатопоточність: boost.threads" is a little boring. You should look at Yahoo's
    front page and see how they create post headlines to grab viewers interested.
    You might add a related video or a related pic or two to get people interested about what you've written. Just my opinion, it would make your posts a little bit more interesting.

    My webpage; lollys

    ВідповістиВидалити
  52. Contract the abs aliment to elevate the berm swords afterward that I agnized that my Thyroidal circumstance
    was the tangible rapscallion! Bone damage can live a Brazil and external
    foundations such as the international Finance Corporation; and whatever indirect welfare the depository financial institution may
    hold deduced from these physical contacts, Abs Nutrition attempted the workplace basically pro bono publico.
    Grundriss der Sportmedizin Fundaments of Sports Medicine for Physicians and Students Herxheimer 1932, a study
    so it's not too bad right-hand?

    Take a look at my webpage; truth about abs

    ВідповістиВидалити