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

давайте возьмем простое приложение (C++), в котором мы пытаемся получить сумму длинного списка целых чисел, используя все 4 процессора, доступные на моем компьютере.

#include ‹iostream›
#include ‹thread›
#include ‹vector›
#include ‹mutex›
#define MAX_THREADS 4 /// вы можете изменить это в соответствии с количеством процессоров

с использованием пространства имен std

std::mutex data_lock;

/// ПОТОК ДЛЯ ЗАПУСКА ПАРАЛЛЕЛЬНО

void FindSum(int start, int end_idx, vector ‹int› &InputList,int &SUM)
{
for(int i=start;i‹end_idx;++i)
{
data_lock.lock(); // для доступа к общей переменной требуется блокировка
SUM+=(InputList[i]);
data_lock.unlock();
}

}

int main()
{
cout ‹‹ «ОБРАЗЕЦ ПОТОЧКИ!» ‹‹ endl;
вектор ‹int› InputList; /// ВВОД СПИСКА INT ОБЩИЙ ПОТОК, ЧТОБЫ НАЙТИ СУММУ СПИСКА
int SUM=0;

// сначала подготавливаем входной список целых чисел
for(int i=0;i‹10000;++i)
InputList.push_back(i);

std::thread t[MAX_THREADS];

/// определяем, сколько входных чисел будет обрабатываться каждым потоком
int MaxLaunch=MAX_THREADS;

int perThreadCount=0,rem=0;
if(MaxLaunch›(int)InputList.size())
{
MaxLaunch=1;
perThreadCount =InputList.size();
}
else
{
perThreadCount=InputList.size()/MaxLaunch;
rem=InputList.size()%MaxLaunch;

/// Запустить поток с заданным диапазоном в списке ввода

int IndCount=0;
for(int i=0;i‹MaxLaunch;i++)
{
int start_idx=IndCount;
if(i= =0)
IndCount+=(perThreadCount+rem);
else
IndCount+=(perThreadCount);

int end_idx=IndCount;

cout‹‹”запускающий поток, который будет работать от start index =”‹‹start_idx‹‹” до end index = “‹‹end_idx‹‹endl;

t[i] = std::thread(FindSum,start_idx,end_idx,std::ref(InputList),std::ref(SUM));
}

/// ждем завершения потоков .

for ( int i=0; i‹MaxLaunch; i++)
{

t[i].join();
}

cout‹‹” — — →THREAD COMPLETE , SUM “‹‹SUM‹‹endl;

вернуть 0;

Обратите внимание, что мы можем запустить больше потоков, чем доступно ЦП на нашем компьютере, но имейте в виду, что в любой момент количество параллельно работающих потоков будет равно количеству доступных ЦП. Только одна инструкция может выполняться процессором одновременно.

Теперь самое главное, когда потоки работают параллельно с одними и теми же данными, — это синхронизация, представьте, что два потока одновременно обновляют переменную SUM, это приведет к повреждению блока памяти, в котором хранится значение SUM. Таким образом, для синхронизации потоков у нас есть механизм под названием MUTEX, который означает взаимное исключение, которое гарантирует, что никакие два потока не будут обновлять SUM одновременно.

Спасибо