четверг, 8 января 2015 г.

Многопоточность в С++ 14. Введение.

Это вторая попытка начать вести блог, надеюсь на удачный исход событий.. Итак, с чего бы я хотел начать.....Многопоточность в С++ 14.  Эта статья будет вводной. Пробация пера.
Статья будет полезна людям, начинающим писать на С++ или программистам, которые не сталкивались с данной проблемой, но хотели бы начать..

Для начала, разберём - что же такое многопоточность?

Из названия ясно, что многопоточность - это одновременное выполнение множества потоков - когда программа  выполняется не в одном потоке, а разбивается на несколько операций, которые можно выполнять параллельно, в нескольких потоках.

Так для чего же нам нужна многопоточность?

1) Разделение между потоками обязанностей

Например, нам необходимо производить сложные вычисления внутри программы с графическим интерфейсом (например, рекурсивный обход дерева файловой системы, с обращением к ЖД).. Если данные вычисления производить в одном потоке с GUI, то GUI начнёт нещадно тормозить и всё может привести к тому, что пользователь, попросту, не захочет иметь дело с такой программой.

Многопоточность помогает тем, что мы разделяем обязанности между 2 потоками.
      1) GUI - отвечает за Графический Интерфейс, его взаимодействие с пользователем.
      2) Пользовательский поток (2 поток) в котором мы будем производить вычисления.

Данный подход позволяет избежать фризов ГИП и выполнение вычислений. Все работают по своим потокам, не мешая никому.

2) Повышение производительности

Современные процессоры имеют 2 и более ядер, что, естественно, не используется эффективно современными однопоточными программами. Ведь не каждая операция выполняется одинаково быстро.
Почему бы тогда нам не использовать наше преимущество?

Допустим, у нас есть 2 функции, которые не зависят друг от друга, и нам необходимо их выполнить намного быстрее. Мы распределяем данные функции между потоками.

1 поток - 1 функция.
2 поток - 2 функция.

Второй  функции не нужно ждать завершения первой, поэтому, в отличие от однопоточной реализации, у нас 2 функции будут совершаться параллельно,
Вследствие этого, процессорные времязатраты будут меньше в 2 раза. Однако, при параллельном выполнении двух зависимых друг от друга функций, будет необходимо произвести синхронизацию, но об этом в следующей статье.

На самом деле мест применения многопоточных приложений настолько много, что описать здесь все случаи, не предоставляется возможным, поэтому, ограничимся и этим.
 

Давайте рассмотрим основной синтаксис написания многопоточных приложений в С++.

#include <iostream>
#include <thread> //Подключение директивы thread стандартной библиотеки С++ 11

using namespace std;

void printString() //Тестовая функция, которая будет вызываться отдельным потоком
{
    cout<<"It's from secondThread, non main"<<std::endl;
}

int main()
{
     thread secondThread(printString); //Создание отдельного потока с передачей функции, которая будет выполняться в отдельном потоке. Теперь у нас Main -поток и SecondThread - поток
    secondThread.join(); //Выполнение второго потока
    return 0;

}

Итак, в отличие от стандартного, однопоточного приложения, у нас есть

1) #include <thread>

Заголовочный файл <thread> содержит в себе определения основных классов стандартной библиотеки поддержки многопоточности в С++. Для его включения нужен компилятор с поддержкой стандарта С++ 11. Например, в Qt Creator, необходимо включить в .pro файл проекта 

CONFIG += c++14

2) thread secondThread(printString); - создание объекта класса thread (создание нового потока) с передачей в параметры функции, которая будет выполняться в этом потоке.

3) secondThread.join() - сигнал для запуска потока, который мы создали на предыдущей процедуре.

Это был простой пример запуска отдельного потока. В следующей статье будем рассматривать средства синхронизации потоков и реальный пример применения средств многопоточности в С++.


суббота, 14 сентября 2013 г.

Новые языковые конструкции языка С++ в стандарте от 2011 года часть 1

Добрый день! Сегодня я хотел бы рассказать о новой функции языка С++ - auto. Это автоматическое определение типа данных переменной, которая была инициализирована.
Например:
auto i = 10; //i будет иметь тип int;
int j()
auto l = j(); //l имеет тип int
Эта полезная функция облегчает жизнь начинающего программиста на С++. Однако при изучении основ языка С++ не следует её использовать постоянно, дабы изучить фундаментальные типы. 

P.S. Написано достаточно просто для понимания, если вы заметили какой-нибудь недостаток - напишите комментарий.

Распродажа на сайте informit.com

Распродажа книг по С++ на сайте informit.com http://informit.com/cplusplus
При покупке одной книги - 30% скидка, при покупке 2 и более книг - 40% для всех книг по С++. Естественно все книги на языке оригинала. Для получения скидки при оформлении заказа вводим код CPLUSPLUS.

Welcome

Добро пожаловать в блог о замечательном языке программирования С++. Здесь я буду публиковать новости, и все то что будет полезно для программиста, который пишет на этом языке.