Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
_Ivana
3233 / 1861 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
#1

Storage durations

28.07.2016, 20:27. Просмотров 1031. Ответов 32
Метки нет (Все метки)

Страшно обилие реализаций абстракции и правил их применения Лямбды, насколько я помню - это объекты (анонимные функтоуры?), создаются без нью, живут на стеке, делита не требуют... Или я все спутал с прямым углом?
 Комментарий модератора 
По мотивам этой темы Прибавить к результату работы функции единицу в куче создана новая, т.к. там обсуждение ушло за рамки вопроса ТС
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2016, 20:27
Ответы с готовыми решениями:

Дублируются файлы в папках и в /storage/emulated/0 и /storage/emulated/legacy — почему?
Почему дублируются папки в Андроид и можно ли это как-то предотвратить?...

Local storage
Доброго времени суток. Недавно появился реквест относительно меню моего сайта....

Local storage
Данный код работает правильно и при перезагрузке фоновый цвет остается....

Local Storage
Пример: есть интернет-магазин, без регистрации. Добавляем товары в корзину....

Internal storage
У меня есть 2 телефона: Samsung ace2 и HTC One V. На первом стоит андроид 2.3,...

32
DrOffset
7970 / 4635 / 1127
Регистрация: 30.01.2014
Сообщений: 7,531
28.07.2016, 20:29 #2
Цитата Сообщение от _Ivana Посмотреть сообщение
Лямбды, насколько я помню - это объекты (анонимные функтоуры?), создаются без нью, живут на стеке, делита не требуют...
Да.
Но ведь это никакое не обилие, все работает в старых рамках: см. storage duration.
Почему лямбды рассматриваются тобой отдельно? Ведь ты любой объект можешь так создать.
1
_Ivana
3233 / 1861 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
28.07.2016, 20:33  [ТС] #3
Цитата Сообщение от DrOffset Посмотреть сообщение
Почему лямбды рассматриваются тобой отдельно?
Потому что я там сидел про них читал, смотрел примеры и использовал. А про
Цитата Сообщение от DrOffset Посмотреть сообщение
Ведь ты любой объект можешь так создать.
я не читал, не смотрел примеры и не использовал Везде пишут - экземпляр создается по конструктору нью, удаляется по делиту вызывая деструктор. А дальше второй страницы я не читал
0
DrOffset
7970 / 4635 / 1127
Регистрация: 30.01.2014
Сообщений: 7,531
28.07.2016, 20:41 #4
Лучший ответ Сообщение было отмечено Kastaneda как решение

Решение

Цитата Сообщение от _Ivana Посмотреть сообщение
Везде пишут - экземпляр создается по конструктору нью, удаляется по делиту вызывая деструктор.
Эм. Честно говоря это очень странное "везде"...

Вот примеры:
C++
1
2
3
4
5
6
void foo()
{
    A * p = new A(10); // Объект типа A инициализированный числом 10 имеет dynamic storage duration: та самая куча. 
    // деструктор ~A() вызовется при выполнении delete
    // Указатель p на объект типа А имеет automatic storage duration: тот самый стек
}
C++
1
2
3
4
5
void foo()
{
    A a(10); // Объект типа A инициализированный числом 10 имеет automatic storage duration, 
    // деструктор вызовется в конце области видимости автоматически
}
C++
1
2
3
4
5
void foo()
{
    static A a(10); // Объект типа A инициализированный числом 10 имеет static storage duration, 
    // деструктор вызовется в конце выполнения программы
}
0
_Ivana
3233 / 1861 / 235
Регистрация: 01.03.2013
Сообщений: 5,091
Записей в блоге: 5
28.07.2016, 20:45  [ТС] #5
DrOffset, офигеть! Кстати, начинаю припоминать, что и подобное читал... Но из-за отсутствия практики применения эта информация быстро выветрилась из оперативной памяти - типа автоматической области видимости: с глаз долой - из сердца мозга вон
0
Kastaneda
Jesus loves me
Эксперт С++
4823 / 2997 / 345
Регистрация: 12.12.2009
Сообщений: 7,559
Записей в блоге: 2
Завершенные тесты: 1
28.07.2016, 20:52 #6
Лучший ответ Сообщение было отмечено Kastaneda как решение

Решение

В С++11 еще появился thread storage duration - объект создается на время жизни потока.
0
Stitch Igorek
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 308
Завершенные тесты: 1
28.07.2016, 21:21 #7
Цитата Сообщение от Kastaneda Посмотреть сообщение
thread storage duration - объект создается на время жизни потока.
поподробнее можно про это? просто
Цитата Сообщение от DrOffset Посмотреть сообщение
void foo()
{
* * A a(10); // Объект типа A инициализированный числом 10 имеет automatic storage duration,
* * // деструктор вызовется в конце области видимости автоматически
}
если foo() будет работать в дополнительном потоке - все равно поток закроется позже чем деструктор в конце функции,
а
Цитата Сообщение от DrOffset Посмотреть сообщение
void foo()
{
* * static A a(10); // Объект типа A инициализированный числом 10 имеет static storage duration,
* * // деструктор вызовется в конце выполнения программы
}
будет (наверно) жить даже после закрытия потока с foo(). можно на примере кода это посмотреть =)
0
Kastaneda
Jesus loves me
Эксперт С++
4823 / 2997 / 345
Регистрация: 12.12.2009
Сообщений: 7,559
Записей в блоге: 2
Завершенные тесты: 1
28.07.2016, 21:34 #8
Цитата Сообщение от Stitch Igorek Посмотреть сообщение
можно на примере кода это посмотреть =)
C++
1
2
3
4
5
6
7
thread_local A a {10}; // это пишем в global scope
 
void foo() // foo выполняется в потоке
{ 
   // 'a' создался
    a.bar();
} // 'a' уничтожился
объект 'a' будет создаваться/уничтожаться для каждого потока.
2
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
28.07.2016, 22:08 #9
Kastaneda, а вы использовали их? Есть какой-то супер профит или проблема которую можно решить только с ними.
0
hoggy
Заблокирован
Эксперт С++
28.07.2016, 22:18 #10
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Есть какой-то супер профит или проблема которую можно решить только с ними.
например - логгер в многопоточной среде.
логгер сам по себе - сингелтон:

C++
1
2
3
4
5
void foo()
{
    log << "ololo"; //<--- треды за него не конкурируют
      //потому что он у каждого треда свой собственный
}
если бы не тред-локал,
тогда пришлось бы всякие мутексы использовать.
и это приводило бы к просадке производительности.

ну или пришлось бы отказаться от глобальной переменной.
1
Kastaneda
Jesus loves me
Эксперт С++
4823 / 2997 / 345
Регистрация: 12.12.2009
Сообщений: 7,559
Записей в блоге: 2
Завершенные тесты: 1
28.07.2016, 22:25 #11
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Kastaneda, а вы использовали их?
На практике не приходилось, просто необходимости не было.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Есть какой-то супер профит или проблема которую можно решить только с ними.
Думаю безусловно есть, сходу пример придумать не могу, мозги спят уже, пол третьего ночи)
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
28.07.2016, 22:37 #12
hoggy, разве объект log не пишет в файл и тем самым хоть объект защищён, но доступ к файлу врядли многопоточный.
0
Kastaneda
Jesus loves me
Эксперт С++
4823 / 2997 / 345
Регистрация: 12.12.2009
Сообщений: 7,559
Записей в блоге: 2
Завершенные тесты: 1
28.07.2016, 22:42 #13
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
разве объект log не пишет в файл и тем самым хоть объект защищён, но доступ к файлу врядли многопоточный.
Вот так можно перемешать данные
C++
1
log << "one" << "two;
в момент каждого << управление может передаться другому потоку.
1
Stitch Igorek
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 308
Завершенные тесты: 1
28.07.2016, 22:42 #14
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Есть какой-то супер профит или проблема которую можно решить только с ними.
Вот думаю при написании игр неплохо сэкономит ресурсы железа(гонять одни и те же данные по множеству функций даже по ссылкам или указателям, затрачивает память - эти указатели помещаются в стек. Использовать глобальные переменные, и работать с ними из функций - немного уменьшает затраты памяти, но усложняет написание многопоточного приложения(одни и те же глобальные переменные будут считаться в разных потоках и ничего хорошего из этого не выйдет), а тут "Эврика" - возможность создать свои "глобальные" переменные для каждого потока).
Может я конечно и не прав...
0
rikimaru2013
C++ Game Dev
2472 / 1141 / 348
Регистрация: 30.11.2013
Сообщений: 3,709
28.07.2016, 22:44 #15
Цитата Сообщение от Stitch Igorek Посмотреть сообщение
Использовать глобальные переменные
Цитата Сообщение от Stitch Igorek Посмотреть сообщение
Может я конечно и не прав...
Может? Как по мне очевидный пуш палки в колесо
0
hoggy
Заблокирован
Эксперт С++
28.07.2016, 23:04 #16
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
разве объект log не пишет в файл
это от реализации зависит.

что мешает каждому треду лить в свой собственный файл,
например?

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

далее процессы доставляют полученные данных в базу данных.

такой логгер работает быстро.
и позволяет фиксировать очень много данных.

Добавлено через 17 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение
Вот так можно перемешать данные
да это как раз таки не проблема.
для этого даже паттерн существует:
"атомарный вывод данных"

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

http://rextester.com/CRYH17410


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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <iostream>
#include <sstream>
#include <vector>
#include <thread>
#include <mutex>
 
namespace detail{
 
    #define dFOR__(char_) \
        typename std::enable_if< std::is_same<typename T::char_type, char_>::value,
 
    #define THIS_OBJECT__(obj_) \
        decltype(obj_)>::type& { return obj_; }
 
    template<class T> auto ostream__() -> dFOR__(char) 
        THIS_OBJECT__(std::cout);
 
    template<class T> auto ostream__() -> dFOR__(wchar_t) 
        THIS_OBJECT__(std::wcout);
 
    #undef THIS_OBJECT__
    #undef dFOR__
 
}//detail
 
template<class T> class AtomicStream
{
    typedef std::mutex 
        mutex_t;
 
    typedef std::basic_ostringstream<typename T::char_type>
        accumulator_t;
public:
    AtomicStream(T& s = detail::ostream__<T>() )
        : mMutex(), mStream(), mDst(s){}
 
   ~AtomicStream(){
        mMutex.lock();
        mDst << mStream.str();
        mMutex.unlock();
    }
 
    template<class U> accumulator_t& operator << (U&& v) { 
        return mStream << v, mStream;
    }
private:
    mutex_t       mMutex;
    accumulator_t mStream;
    T&            mDst;
};
 
typedef AtomicStream<std::ostream>
    AStream;
typedef AtomicStream<std::wostream>
    WAStream;
 
 
 
//------------------------------------------------------
 
 
void atomic_print(const std::string& name, const size_t indx)
{
    AStream() << "thread(" << std::this_thread::get_id() << ") "<< name
        << " printing: " << indx 
        << std::endl;
}
 
void threadFunction(const std::string& name)
{
    for(size_t n=0;n<20; ++n)
        atomic_print(name, n);
}
 
 
 
int main()
{
    std::cout << "Hello, world!\n";
    
    const char* names[] = { "one", "two", "foo", "bar", "baz" };
    
    std::vector<std::thread> threads;
    for(size_t n=0; n< 5; ++n)
        threads.emplace_back(&threadFunction, names[n] );
 
    for(size_t n=0; n<5; ++n)
        threads[n].join();
    
    AStream() << "finished!"<<std::endl;
}
Добавлено через 1 минуту
Цитата Сообщение от Stitch Igorek Посмотреть сообщение
а тут "Эврика" - возможность создать свои "глобальные" переменные для каждого потока).
Может я конечно и не прав...
нет. вы именно что правы.

в этом вся суть идеи - глобальные переменные,
свои для каждого потока.
1
Avazart
Эксперт С++
7718 / 5627 / 549
Регистрация: 10.12.2010
Сообщений: 25,330
Записей в блоге: 17
28.07.2016, 23:15 #17
Цитата Сообщение от Kastaneda Посмотреть сообщение
C++
1
2
3
4
5
6
7
thread_local A a {10}; // это пишем в global scope
 
void foo() // foo выполняется в потоке
{ 
   // 'a' создался
    a.bar();
} // 'a' уничтожился
объект 'a' будет создаваться/уничтожаться для каждого потока.
Чем это будет отличатся от обычного локального объекта созданного внутри ф-ции потока?
Только тем что стек не будет занимать?
0
Kastaneda
Jesus loves me
Эксперт С++
4823 / 2997 / 345
Регистрация: 12.12.2009
Сообщений: 7,559
Записей в блоге: 2
Завершенные тесты: 1
29.07.2016, 08:58 #18
Цитата Сообщение от Avazart Посмотреть сообщение
Только тем что стек не будет занимать?
Честно говоря в этом не уверен, возможно объект располагается на стеке потока, при этом виден из других ф-ций потока.
0
Operok
177 / 175 / 66
Регистрация: 15.02.2015
Сообщений: 505
Завершенные тесты: 2
29.07.2016, 10:01 #19
hoggy, берём на вооружение данную обёртку над потоком. Надо было для демонстрации потоки при старте "усыпить" и разбудить "одновременно", например atomic_bool. А то поток создаётся дольше чем выполняется, т.е. к моменту запуска предыдущий уже своё отработал.
По поводу thread_local. Во многих библиотеках (как правило на Си), нужно производить некую инициализацию, при чём для каждого потока отдельно, сразу захотелось завернуть эту инициализацию в конструктор некого класса, скажем SomeLibThreadContext, и засунуть его в TLS через thread_local. Но не тут-то было... мало того что в mvc13 нет такого ключевого слова (__declspec(thread) вместо него), так и использовать можно только POD типы.
0
hoggy
Заблокирован
Эксперт С++
29.07.2016, 13:49 #20
Цитата Сообщение от Operok Посмотреть сообщение
мало того что в mvc13 нет такого ключевого слова (__declspec(thread) вместо него), так и использовать можно только POD типы.
делайте указатель,
и вешайте на него объекты любых типов.
0
29.07.2016, 13:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2016, 13:49

Не работает storage.sort()
Не пойму в чем дело. Вроде меняет первоначальную структуру, но не до конца....

Intel Rapid Storage
Что это за прога ?

Storage Engine в MySQL
Здраствуйте.Может кто нибуть подсказать что означает Storage Engine в MySQL?...


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

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

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