Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.87/30: Рейтинг темы: голосов - 30, средняя оценка - 4.87
0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
1

C++ 11 многопоточность Future и promise

17.12.2014, 17:09. Показов 6202. Ответов 4
Метки нет (Все метки)

Всем Привет!!! Пытаюсь разобраться уже несколько дней, пока не получается, не могу понять как же всё таки работают future и promise и как с ними работать, итак изложу суть проблемы, для примера попоробую показатьь как я пытаюсь и у меня не получается найти число PI методом монте- Карло, итак вот функция которая подсчиатвыатет и возвращает количество точек которые попали в окружность

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
static const long unsigned int NUM_POINTS = 100000000; static const double RADIUS = 0.5; static const double CENTER_X = 0.5; static const double CENTER_Y = 0.5;
 
 
 
 
bool inCircle(float x1, float y1) //функция проверки находится ли точка в круге {
    //если расстояние от точки до центра окружности (см. Т.Пифагора) меньше радиуса окружности, 
    //то точка в круге, возврат результата TRUE, иначе FALSED:\учёба\университет\5Семестр\ПП\лаба2\monteCarlo\monteCarlo\monteCarlo.cpp
    return sqrt((CENTER_X - x1)*(CENTER_X - x1) + (CENTER_Y - y1)*(CENTER_Y - y1)) <= RADIUS; }
 
int testForPromise(int number)
{
    int numInCircle = 0;
    srand(time(NULL));
    for (size_t i = 0; i < number; ++i) {
        double x = (double)rand() / (double)RAND_MAX;
        double y = (double)rand() / (double)RAND_MAX;
        if (inCircle(x, y))
        {
            ++numInCircle;
        }
    }
    return numInCircle;
 
 
}
Это всё замечательно работает, но далее , так как это довольно таки долгая операция, я хочу выполнять её и как то демонстрировать прогресс , то есть сколько точек из всего количества обработано, первое что я делаю, это изменяю метод testForPromise, и добавляю в main данный код, тут сразуоговорюсь , я не уверен что сделал правильно ( скорее наоборот уверен что где то ошибся), итак первый вопрос : в правильном ли месте функции testForPromise, я написал p.set_value(numInCircle);. ?
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
bool inCircle(float x1, float y1) //функция проверки находится ли точка в круге {
    //если расстояние от точки до центра окружности (см. Т.Пифагора) меньше радиуса окружности, 
    //то точка в круге, возврат результата TRUE, иначе FALSED:\учёба\университет\5Семестр\ПП\лаба2\monteCarlo\monteCarlo\monteCarlo.cpp
    return sqrt((CENTER_X - x1)*(CENTER_X - x1) + (CENTER_Y - y1)*(CENTER_Y - y1)) <= RADIUS; }
 
int testForPromise(int number, std::promise<int> &p) {
    int numInCircle = 0;
    srand(time(NULL));
    for (size_t i = 0; i < number; ++i) {
        double x = (double)rand() / (double)RAND_MAX;
        double y = (double)rand() / (double)RAND_MAX;
        if (inCircle(x, y))
        {
            ++numInCircle;
        }
        p.set_value(numInCircle);
    }
    return numInCircle;
 
 
}
int main()
{
    std::promise<int> promise;
    auto testPromise = std::async(std::launch::async, testForPromise, NUM_POINTS / 2, std::ref(promise));
Далее насколько я понял теперь чтобы как раз таки и получить прогресс, нужно, написать следующее
C++
1
std::future<int> fut(promise.get_future());
это как я понял, говорит о том что теперь в объекте fut будет храниться последнее число которое мы устанваливаем p.set_value(numInCircle); в функции testForPromise. правильно ?
итак далее подходим к самому интересному, пока результат не готов, т е в коде это отображается так
C++
1
2
3
4
5
auto status = testPromise.wait_for(std::chrono::milliseconds(1));
    while (status != std::future_status::ready) { std::cout << fut.get() << std::endl;
        status = testPromise.wait_for(std::chrono::milliseconds(1));
}
    {
тут мы ждем ппока статус не будет "READY" и выводим количество точек, Где здесь ошибка ?
и полседняя строка выводим результат который посчитался
C++
1
std::cout << testPromise.get() << std::endl;
Вот, и это всё не работает, почему ? Где я ошибся ? я только осваиваю многопоточное программирование в c++ 11 и много из всего вышеописанного совсем неправильно, но задача действительно интересная на мой взгляд, я очень хочу понять как она решается и как устроен механизм promise future. всем спасибо за внимание, за любые подсказки и любые ссылки на полезные статьи, тоже огромное спасибо!!!
приведу весь код целиком
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
// test3.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
#include <future>
#include <thread>
#include <Windows.h>
static const long unsigned int NUM_POINTS = 100000000; static const double RADIUS = 0.5; static const double CENTER_X = 0.5; static const double CENTER_Y = 0.5;
 
 
 
 
bool inCircle(float x1, float y1) //функция проверки находится ли точка в круге {
    //если расстояние от точки до центра окружности (см. Т.Пифагора) меньше радиуса окружности, 
    //то точка в круге, возврат результата TRUE, иначе FALSED:\учёба\университет\5Семестр\ПП\лаба2\monteCarlo\monteCarlo\monteCarlo.cpp
    return sqrt((CENTER_X - x1)*(CENTER_X - x1) + (CENTER_Y - y1)*(CENTER_Y - y1)) <= RADIUS; }
 
int testForPromise(int number, std::promise<int> &p) {
    int numInCircle = 0;
    srand(time(NULL));
    for (size_t i = 0; i < number; ++i) {
        double x = (double)rand() / (double)RAND_MAX;
        double y = (double)rand() / (double)RAND_MAX;
        if (inCircle(x, y))
        {
            ++numInCircle;
        }
        p.set_value(numInCircle);
    }
    return numInCircle;
 
 
}
int main()
{
    std::promise<int> promise;
    auto testPromise = std::async(std::launch::async, testForPromise, NUM_POINTS / 2, std::ref(promise));
    std::future<int> fut(promise.get_future());
    auto status = testPromise.wait_for(std::chrono::milliseconds(1));
    while (status != std::future_status::ready)
    {
        
        std::cout << fut.get() << std::endl;
        status = testPromise.wait_for(std::chrono::milliseconds(1));
    }
    std::cout << testPromise.get() << std::endl;
 
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.12.2014, 17:09
Ответы с готовыми решениями:

Шаблоны и ссылки. Promise<T>, Future<T>
Дали задание написать Promise&lt;T&gt; и Future&lt;T&gt;. Сделал у обоих shared_ptr на структуру, в которой...

Построение архитектуры асинхронного кода через future/promise
Всем привет Недавно размышлял над двумя путями реализации асинхронного кода : с помощью...

Promise, два ajax запроса, задать очередь выполнения запросов, цепочка promise
Добрый день, уважаемые форумчане! Помогите разобраться с цепочкой promise. Суть проблемы: Есть...

I am doing for the future
Объясните, по каком правилу тут используется I'm not healing, а не I won't heal. В Мерфи про...

4
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.12.2014, 17:20 2
Misha_prog, Не получится так. Когда в promise устанавливается значение через set_value/set_exception (set_value), то future, которая хранится в promise получает статус ready. Делайте через атомики как вы и говорили ранее.
1
0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
17.12.2014, 17:23  [ТС] 3
Спасибо!!!А можно вообще хоть как-нибудь возвращать промежуточные результаты через promise?
0
В астрале
Эксперт С++
8035 / 4792 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
17.12.2014, 17:24 4
Misha_prog, Нет. Если в promise уже что-то установлено будет выброшено исключение. Если get_future вызывать более 1 раза будет выброшено исключение.
1
0 / 0 / 1
Регистрация: 15.04.2013
Сообщений: 184
17.12.2014, 19:28  [ТС] 5
Спасибо большое! теперь вроде бы в голове прояснилось!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2014, 19:28

Cry Me A Future
здравствуйте! &quot;cry me a river&quot; я нашёл как переводить а вот cry me a future )))))))))) там...

ExecutorService, ArrayList<Future<>>
Такой вот код, получаю nullPointException на строчке FutureCount.add(pool.submit(new...

Использование AsynchronousSocketChannel и Future <T>
Задали в универе написать программу, асинхронно вычисляющую две функции. Вот что нужно использовать...

Present Tenses(I am doing/I do) for the future
Helen, I'm going to the supermarket. ...(you/come) with me? Правильный ответ: &quot;Are you coming...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.