Лямбды, потоки и статические переменные

386
03 апреля 2017, 08:04

Предположим, что такое использование статической переменной как счетчика входов в лямбда-функцию легально:

#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>

typedef std::pair<int,int> mypair;
std::ostream &operator<< (std::ostream &os, mypair const &data) {
    return os << "(" << data.first << ": " << data.second << ") ";
}
int main()
{
    int n;
    std::vector<mypair> v;
    std::cin >> n;
    v.reserve(n);
    std::for_each(std::begin(v), std::end(v), [](mypair& x) {
        static int i = 0;
        std::cin >> x.second;
        x.first = i++;
    });
    std::for_each(std::begin(v), std::end(v), [](mypair& x) {
        std::cout << x;
    });
    return 0;
}   

Теперь задача сложнее. Есть контейнер workers

std::vector<std::thread> workers;
for (int i = 0; i < 5; i++) {
    workers.push_back(std::thread([]() 
    {
        std::cout << "thread #" << "start\n";
        doLengthyOperation();
        std::cout << "thread #" << "finish\n";
    }));
}

Код в doLengthyOperation() обеспечивает изолированную задачу (на практике - запуск нового процесса с определенными параметрами и ожидание его завершения). Каковы возможные реализации "счетчика", если необходимо отслеживать начало и конец запущенных задач без использования глобальных переменных , при запуске через for_each().

std::for_each(workers.begin(), workers.end(), [](std::thread &t) 
{
    t.join();
});

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

PS: Мой оригинальный пост http://stackoverflow.com/questions/43156892/lambda-expressions-concurrency-and-static-variables

READ ALSO
Как правильно наследовать класс?

Как правильно наследовать класс?

Создаю класс Stack, который наследует LinkedList, но выдает ошибку еще при компиляции, подскажите, в чем проблема

290
Qt connect с разными аргументами

Qt connect с разными аргументами

Здравствуйте! Как сделать connect с разными аргументами (qint64 и int)?

231
Как установить библиотеку Qt?

Как установить библиотеку Qt?

Всем здравствуйтеНедавно начал изучать С++, и захотелось написать самое простое приложение с графическим окном

299
HasPyRuCP+: Runtime Error

HasPyRuCP+: Runtime Error

Недавно появился язык HasPyRuCP+Написал программу которая принимает от пользователя граф и две вершины

240