Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
2 / 1 / 1
Регистрация: 01.08.2015
Сообщений: 27

Ошибка при использовании std::async

10.04.2020, 13:02. Показов 2286. Ответов 8

Студворк — интернет-сервис помощи студентам
Всем привет! Имеется класс с методом, которых принимает и возвращает вектор. Необходимо запустить примерно amount (планировщик сам определит) таких преобразований параллельно. Почему происходит исключение, связанное с выходом за границы вектора, причем даже с закомментированной частью? Как это исправить?

Program: C:\WINDOWS\SYSTEM32\MSVCP140D.dll
File: c:\program files (x86)\microsoft visual studio 14.0\vc\include\vector
Line: 1234

Expression: vector subscript out of range

For information on how your program can cause an assertion
failure, see the Visual C++ documentation on asserts.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <future>
#include <vector>
#include <queue>
 
class Setter {
public:
    std::vector<int> set(std::vector<int> const &data) {
        int N = data.size() + 2;
        std::vector<int> out_data(N);
        for (auto i = 0; i < N; i++) {
            out_data[i] = i;
        }
        return out_data;
    }
};
 
int main() {
    int amount = 5;
    std::vector<std::vector<int>> data(amount);
 
    for (auto i = 0; i < amount; i++) {
        data[i].resize(i + 3);
        for (auto j = 0; j < data[i].size(); j++) {
            data[i][j] = i + j;
        }
    }
 
    std::queue<std::future<std::vector<int>>> fut_queue;
    std::vector<Setter> setters(amount);
 
    for (auto i = 0; i < amount; i++) {
        fut_queue.push(std::async(std::launch::async, [&] {
            return setters[i].set(data[i]);
        }));
    }
 
    //std::vector<int> current_result(100);
    //while (!fut_queue.empty()) {
    //  auto &task = fut_queue.front();
    //  current_result = task.get();
    //  fut_queue.pop();
    //}
    
    return 0;
}
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.04.2020, 13:02
Ответы с готовыми решениями:

std::async(std::launch::async и глобальная g_Future переменная
Весь код давать не буду, достаточно описать логику: 1. Я объявил переменную g_Future глобальной, чтобы асинхрон работал и после...

Ошибка при использовании std::allocator
Пытаюсь разобраться с использование std::allocator. Вот пример кода: template &lt;typename T, typename A&gt; struct vector_base { ...

В чем ошибка при использовании std::threads
Добрый день! Упражняюсь в std::threads, написал вот такую-вот программку. Выдает ошибку: error C2280:...

8
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.04.2020, 13:08
Цитата Сообщение от Patifon_Kakao Посмотреть сообщение
Всем привет! Имеется класс с методом, которых принимает и возвращает вектор. Необходимо запустить примерно amount (планировщик сам определит) таких преобразований параллельно. Почему происходит исключение, связанное с выходом за границы вектора, причем даже с закомментированной частью? Как это исправить?
Надо синхронизировать доступ к setters
C++
1
2
3
4
5
6
7
8
9
10
std::mutex mx;
std::vector<Setter> setters(amount);
 
for (auto i = 0; i < amount; i++) {
    fut_queue.push(std::async(std::launch::async, [&] 
    {
        std::unique_lock<std::mutex> lock(mx);
        return setters[i].set(data[i]);
    }));
}
0
2 / 1 / 1
Регистрация: 01.08.2015
Сообщений: 27
10.04.2020, 13:30  [ТС]
Не помогает, все таже ошибка.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.04.2020, 13:33
Цитата Сообщение от Patifon_Kakao Посмотреть сообщение
Не помогает, все таже ошибка.
std::async(std::launch::async, [i, &setters, &data] {

Добавлено через 16 секунд
i надо передавать по-значению

Добавлено через 21 секунду
Мьютекс тогда, кстати, не нужен
0
2 / 1 / 1
Регистрация: 01.08.2015
Сообщений: 27
10.04.2020, 13:45  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
std::async(std::launch::async, [i, &setters, &data] {

i надо передавать по-значению
По-прежнему таже ошибка. Может надо в очереде как-то память проинициализировать?

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <future>
#include <vector>
#include <queue>
 
std::mutex mx;
 
class Setter {
public:
    std::vector<int> set(std::vector<int> const &data) {
        int N = data.size() + 2;
        std::vector<int> out_data(N);
        for (auto i = 0; i < N; i++) {
            out_data[i] = i;
        }
        return out_data;
    }
};
 
int main() {
    int amount = 5;
    std::vector<std::vector<int>> data(amount);
 
    for (auto i = 0; i < amount; i++) {
        data[i].resize(i + 3);
        for (auto j = 0; j < data[i].size(); j++) {
            data[i][j] = i + j;
        }
    }
 
    std::queue<std::future<std::vector<int>>> fut_queue;
    std::vector<Setter> setters(amount);
 
    for (auto i = 0; i < amount; i++) {
        fut_queue.push(std::async(std::launch::async, [i, &setters, &data]
        {
            std::unique_lock<std::mutex> lock(mx);
            return setters[i].set(data[i]);
        }));
    }
 
    //std::vector<int> current_result(100);
    //while (!fut_queue.empty()) {
    //  auto &task = fut_queue.front();
    //  current_result = task.get();
    //  fut_queue.pop();
    //}
    
    return 0;
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.04.2020, 13:55
Лучший ответ Сообщение было отмечено Patifon_Kakao как решение

Решение

Цитата Сообщение от Patifon_Kakao Посмотреть сообщение
По-прежнему таже ошибка. Может надо в очереде как-то память проинициализировать?
Добавь в конце fut_queue.clear(), перед return 0;

Добавлено через 54 секунды
А то у тебя сначала уничтожаются setters, а потом останавливаются async

Добавлено через 2 минуты
Сделай std::vector<std::future<std::vector<int>>> fut_queue; нафига тебе эта queue?
1
2 / 1 / 1
Регистрация: 01.08.2015
Сообщений: 27
10.04.2020, 14:06  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Добавь в конце fut_queue.clear(), перед return 0;
Спасибо, помогло.
P.S. только у очереди нету метода clear().

Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <future>
#include <vector>
#include <queue>
 
 
class Setter {
public:
    std::vector<int> set(std::vector<int> const &data) {
        int N = data.size() + 2;
        std::vector<int> out_data(N);
        for (auto i = 0; i < N; i++) {
            out_data[i] = i;
        }
        return out_data;
    }
};
 
int main() {
    int amount = 5;
    std::vector<std::vector<int>> data(amount);
 
    for (auto i = 0; i < amount; i++) {
        data[i].resize(i + 3);
        for (auto j = 0; j < data[i].size(); j++) {
            data[i][j] = i + j;
        }
    }
 
    std::queue<std::future<std::vector<int>>> fut_queue;
    std::vector<Setter> setters(amount);
 
    for (auto i = 0; i < amount; i++) {
        fut_queue.push(std::async(std::launch::async, [i, &setters, &data]
        {
            return setters[i].set(data[i]);
        }));
    }
 
    auto i = 0;
    std::vector<std::vector<int>> result(amount);
    while (!fut_queue.empty()) {
        auto &task = fut_queue.front();
        result[i] = task.get();
        fut_queue.pop();
        ++i;
    }
    
    while (!fut_queue.empty()) {
        fut_queue.pop();
    }
 
    return 0;
}
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
10.04.2020, 14:08
Цитата Сообщение от Patifon_Kakao Посмотреть сообщение
Спасибо, помогло.
P.S. только у очереди нету метода clear().
task.get(); тоже сойдёт, она ждёт, пока async завершится.

Добавлено через 28 секунд
И std::unique_lock<std::mutex> lock(mx); тоже не нужен, попробуй убрать
2
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
10.04.2020, 14:18
Цитата Сообщение от Patifon_Kakao Посмотреть сообщение
for (auto i = 0; i < amount; i++) {
        fut_queue.push(std::async(std::launch::a sync, [&] {
            return setters[i].set(data[i]);
        }));
    }
https://rextester.com/MTB8648

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <future>
#include <vector>
#include <queue>
#include <iostream>
 
class Setter {
public:
    std::vector<int> set(std::vector<int> const &data) {
        const size_t count = data.size() + 2;
        std::vector<int> out_data(count);
        for (size_t i = 0; i < count; ++i)
            out_data[i] = static_cast<int>(i);
        return out_data;
    }
};
 
int main() {
    const size_t amount = 5;
    std::vector<std::vector<int>> data(amount);
 
    for (size_t i = 0; i < amount; ++i) 
    {
        data[i].resize(i + 3);
        for (size_t j = 0; j < data[i].size(); ++j) 
        {
            std::cout << "[" << i << "][" << j << "] " << i + j << '\t';
            data[i][j] = static_cast<int>(i + j);
        }
        std::cout << std::endl;
    }
  
    std::queue<std::future<std::vector<int>>> fut_queue;
    std::vector<Setter> setters(amount);
 
    for (size_t i = 0; i < amount; ++i)  {
        const auto lambda = [&data, &setters, i]{ return setters[i].set(data[i]); };
        fut_queue.push(std::async(std::launch::async, lambda));
    }
    
    std::cout << std::endl;
    while (!fut_queue.empty()) {
      auto& task = fut_queue.front();
      const auto result = task.get();
      std::cout << "result: ";
      for(const auto& el: result)
          std::cout << el << ", ";
      std::cout << std::endl;
      fut_queue.pop();
    }
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.04.2020, 14:18
Помогаю со студенческими работами здесь

Выдается ошибка в std при использовании оператора for
Написал программу с использованием оператора for на С++. Вот код: # include &lt;iosteam&gt; int main () { int sum = 0; ...

Ошибка при использовании erase для std::vector
Почему в случае удаления элемента из вектора с помощью передачи итератора в erase, который соответствует позиции удаляемого элемента...

std::async std::future и функции-члены
как в async передать функцию-член нужного мне обьекта класса? С простыми функциями получилось, а вот тут засада. Заранее спасибо за...

Ошибки при использовании std::map
Скажите, что я делаю не так? Почему у меня появились эти ошибки и предупреждения? Вот код: #include &lt;iostream&gt; #include...

Программа падает при использовании std::thread
Дополнительный вопрос:почему эта программа падает: #include &lt;thread&gt; #include &lt;Windows.h&gt; void client(int arg){ } int main() { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru