Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
1

Storage durations

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

Author24 — интернет-сервис помощи студентам
Страшно обилие реализаций абстракции и правил их применения Лямбды, насколько я помню - это объекты (анонимные функтоуры?), создаются без нью, живут на стеке, делита не требуют... Или я все спутал с прямым углом?
 Комментарий модератора 
По мотивам этой темы Прибавить к результату работы функции единицу в куче создана новая, т.к. там обсуждение ушло за рамки вопроса ТС
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.07.2016, 20:27
Ответы с готовыми решениями:

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

File Storage
Необходимо работать с StorageFile, но никак не могу найти библиотеку, которую надо подключить....

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

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

32
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
28.07.2016, 20:29 2
Цитата Сообщение от _Ivana Посмотреть сообщение
Лямбды, насколько я помню - это объекты (анонимные функтоуры?), создаются без нью, живут на стеке, делита не требуют...
Да.
Но ведь это никакое не обилие, все работает в старых рамках: см. storage duration.
Почему лямбды рассматриваются тобой отдельно? Ведь ты любой объект можешь так создать.
1
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
28.07.2016, 20:33  [ТС] 3
Цитата Сообщение от DrOffset Посмотреть сообщение
Почему лямбды рассматриваются тобой отдельно?
Потому что я там сидел про них читал, смотрел примеры и использовал. А про
Цитата Сообщение от DrOffset Посмотреть сообщение
Ведь ты любой объект можешь так создать.
я не читал, не смотрел примеры и не использовал Везде пишут - экземпляр создается по конструктору нью, удаляется по делиту вызывая деструктор. А дальше второй страницы я не читал
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
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
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
28.07.2016, 20:45  [ТС] 5
DrOffset, офигеть! Кстати, начинаю припоминать, что и подобное читал... Но из-за отсутствия практики применения эта информация быстро выветрилась из оперативной памяти - типа автоматической области видимости: с глаз долой - из сердца мозга вон
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
28.07.2016, 20:52 6
Лучший ответ Сообщение было отмечено Kastaneda как решение

Решение

В С++11 еще появился thread storage duration - объект создается на время жизни потока.
0
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 312
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
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
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
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
28.07.2016, 22:08 9
Kastaneda, а вы использовали их? Есть какой-то супер профит или проблема которую можно решить только с ними.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.07.2016, 22:18 10
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Есть какой-то супер профит или проблема которую можно решить только с ними.
например - логгер в многопоточной среде.
логгер сам по себе - сингелтон:

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

ну или пришлось бы отказаться от глобальной переменной.
1
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
28.07.2016, 22:25 11
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Kastaneda, а вы использовали их?
На практике не приходилось, просто необходимости не было.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Есть какой-то супер профит или проблема которую можно решить только с ними.
Думаю безусловно есть, сходу пример придумать не могу, мозги спят уже, пол третьего ночи)
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
28.07.2016, 22:37 12
hoggy, разве объект log не пишет в файл и тем самым хоть объект защищён, но доступ к файлу врядли многопоточный.
0
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
28.07.2016, 22:42 13
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
разве объект log не пишет в файл и тем самым хоть объект защищён, но доступ к файлу врядли многопоточный.
Вот так можно перемешать данные
C++
1
log << "one" << "two;
в момент каждого << управление может передаться другому потоку.
1
47 / 47 / 31
Регистрация: 02.04.2016
Сообщений: 312
28.07.2016, 22:42 14
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Есть какой-то супер профит или проблема которую можно решить только с ними.
Вот думаю при написании игр неплохо сэкономит ресурсы железа(гонять одни и те же данные по множеству функций даже по ссылкам или указателям, затрачивает память - эти указатели помещаются в стек. Использовать глобальные переменные, и работать с ними из функций - немного уменьшает затраты памяти, но усложняет написание многопоточного приложения(одни и те же глобальные переменные будут считаться в разных потоках и ничего хорошего из этого не выйдет), а тут "Эврика" - возможность создать свои "глобальные" переменные для каждого потока).
Может я конечно и не прав...
0
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
28.07.2016, 22:44 15
Цитата Сообщение от Stitch Igorek Посмотреть сообщение
Использовать глобальные переменные
Цитата Сообщение от Stitch Igorek Посмотреть сообщение
Может я конечно и не прав...
Может? Как по мне очевидный пуш палки в колесо
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
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
Эксперт С++
8385 / 6147 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
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
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
29.07.2016, 08:58 18
Цитата Сообщение от Avazart Посмотреть сообщение
Только тем что стек не будет занимать?
Честно говоря в этом не уверен, возможно объект располагается на стеке потока, при этом виден из других ф-ций потока.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
29.07.2016, 10:01 19
hoggy, берём на вооружение данную обёртку над потоком. Надо было для демонстрации потоки при старте "усыпить" и разбудить "одновременно", например atomic_bool. А то поток создаётся дольше чем выполняется, т.е. к моменту запуска предыдущий уже своё отработал.
По поводу thread_local. Во многих библиотеках (как правило на Си), нужно производить некую инициализацию, при чём для каждого потока отдельно, сразу захотелось завернуть эту инициализацию в конструктор некого класса, скажем SomeLibThreadContext, и засунуть его в TLS через thread_local. Но не тут-то было... мало того что в mvc13 нет такого ключевого слова (__declspec(thread) вместо него), так и использовать можно только POD типы.
0
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.07.2016, 13:49 20
Цитата Сообщение от Operok Посмотреть сообщение
мало того что в mvc13 нет такого ключевого слова (__declspec(thread) вместо него), так и использовать можно только POD типы.
делайте указатель,
и вешайте на него объекты любых типов.
0
29.07.2016, 13:49
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.07.2016, 13:49
Помогаю со студенческими работами здесь

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

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

Intel Rapid Storage
Что это вообще за штука? Это софтина, драйвер, утилита, или драйвер с возможностью управления через...

Mass storage class
Продолжение этой темы. Я не использую SD карту, поэтому меняю код файла usbd_storage.c следующим...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru