Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> async с передачей ссылки 
V
    Опции темы
disputant
  Дата 10.9.2015, 16:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



Пытался ужаться с исходником покороче, но что уж вышло, то вышло.
Словом, была программа, которая работала себе, пока не захотелось ее сделать многопоточной. Вычисления проводились в классе, возврат значений шел путем передачи по ссылке. Ничего лишнего не модифицировалось, никакие переменные не пропадали (время жизни не заканчивалось), так что вроде все путем.

Простая замена вызова на async привела к тому, что перестал работать возврат по ссылке.
Словом, ужался, как мог, чтобы получить тот же эффект. При вызове обычной функции (не члена класса) такой эффект получить не удалось, не вышло даже передать аргумент по ссылке.

Соответственно, эксперты, не поясните, что происходит? Т.е. как поступить - пояснять не надо, программа подправлена и все работает, но вот сам эффект - когда у переданного по ссылке аргумента изменился арес... Что это было? Почему? Где об этом почитать?

Заранее спасибо.

Компилятор - Visual C++ 2013.

Код

#include <iostream>
#include <future>
#include <chrono>

using namespace std;

mutex outMutex;

class Test
{
public:
    Test(){}
    void out(int No, double& q) const
    {
        {
            lock_guard<mutex> tst(outMutex);
            cout << "<- " << No << " -- " << &q << endl;
        }
        this_thread::sleep_for(chrono::seconds(1));
    }
    void test() const;
};


void Test::test() const
{
    double w[2];
    cout << "-> " << 0 << " -- " << &w[0] << endl;
    future<void> f1 = async(mem_fn(&Test::out),this,0,w[0]);
    {
        lock_guard<mutex> tst(outMutex);
        cout << "-> " << 1 << " -- " << &w[1] << endl;
    }
    future<void> f2 = async(mem_fn(&Test::out),this,1,w[1]);
    f1.get();
    f2.get();
}

int main(int argc, const char * argv[])
{
    try {

        Test t;
        t.test();
    }
    catch(exception&e)
    {
        cout << "\n" << e.what() << endl;
    }
}



Это сообщение отредактировал(а) disputant - 10.9.2015, 16:26
PM MAIL   Вверх
borisbn
Дата 11.9.2015, 09:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



Чтобы передать по ссылке используй std::ref

Цитата
future< void > f1 = async( &Test::out, this, 0, ref( w[ 0 ] ) );


http://ideone.com/zmvJxG

И, кстати, mem_fn тут не нужен

Это сообщение отредактировал(а) borisbn - 11.9.2015, 09:17


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
disputant
Дата 11.9.2015, 10:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



Цитата(borisbn @ 11.9.2015,  09:15)
Чтобы передать по ссылке используй std::ref

Цитата
future< void > f1 = async( &Test::out, this, 0, ref( w[ 0 ] ) );


http://ideone.com/zmvJxG

И, кстати, mem_fn тут не нужен

Спасибо!
А где бы всерьез про это почитать, а то мои знания по этому вопросу практически только из Мейерса (Modern Effective C++)
PM MAIL   Вверх
borisbn
Дата 11.9.2015, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 22
Всего: 135



disputant, шаблоны и выведение типов, пожалуй, самая сложная штука в С++.

Цитата(disputant @  11.9.2015,  10:00 Найти цитируемый пост)
А где бы всерьез про это почитать

Честно? Я нигде не читал, но каждый день захожу на StackOverflow и просматриваю интересные вопросы/ответы. Там уже был вопрос один в один как твой. Меня тогда заинтересовало - прочитал. Запомнил  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
baldina
Дата 11.9.2015, 16:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



disputant, погляди
для подобных штук в С++11 введены std::reference_wrapper и std::ref. Зачем еще они могут быть нужны описано например на cppreference.com
PM MAIL   Вверх
baldina
Дата 11.9.2015, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Всерьез почитать можно стандарт, а если попроще - здесь например 
Цитата

3) If P is a reference type, the type referred to by P is used for deduction

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

Это сообщение отредактировал(а) baldina - 11.9.2015, 17:23
PM MAIL   Вверх
disputant
Дата 13.9.2015, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 28.11.2011

Репутация: нет
Всего: 3



Всем спасибо!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0581 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.