Форум программистов, компьютерный форум CyberForum.ru

Storage durations - C++

Восстановить пароль Регистрация
 
 
_Ivana
2183 / 1388 / 124
Регистрация: 01.03.2013
Сообщений: 4,133
Записей в блоге: 2
28.07.2016, 20:27     Storage durations #1
Страшно обилие реализаций абстракции и правил их применения Лямбды, насколько я помню - это объекты (анонимные функтоуры?), создаются без нью, живут на стеке, делита не требуют... Или я все спутал с прямым углом?
 Комментарий модератора 
По мотивам этой темы Прибавить к результату работы функции единицу в куче создана новая, т.к. там обсуждение ушло за рамки вопроса ТС
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.07.2016, 20:27     Storage durations
Посмотрите здесь:

HTML, CSS HTML5 Database storage
Android Internal storage
Storage Engine в MySQL MySQL
VK API метод storage.get ActionScript
JavaScript Local storage
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
28.07.2016, 20:29     Storage durations #2
Цитата Сообщение от _Ivana Посмотреть сообщение
Лямбды, насколько я помню - это объекты (анонимные функтоуры?), создаются без нью, живут на стеке, делита не требуют...
Да.
Но ведь это никакое не обилие, все работает в старых рамках: см. storage duration.
Почему лямбды рассматриваются тобой отдельно? Ведь ты любой объект можешь так создать.
_Ivana
2183 / 1388 / 124
Регистрация: 01.03.2013
Сообщений: 4,133
Записей в блоге: 2
28.07.2016, 20:33  [ТС]     Storage durations #3
Цитата Сообщение от DrOffset Посмотреть сообщение
Почему лямбды рассматриваются тобой отдельно?
Потому что я там сидел про них читал, смотрел примеры и использовал. А про
Цитата Сообщение от DrOffset Посмотреть сообщение
Ведь ты любой объект можешь так создать.
я не читал, не смотрел примеры и не использовал Везде пишут - экземпляр создается по конструктору нью, удаляется по делиту вызывая деструктор. А дальше второй страницы я не читал
DrOffset
6425 / 3799 / 880
Регистрация: 30.01.2014
Сообщений: 6,592
28.07.2016, 20:41     Storage durations #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от _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, 
    // деструктор вызовется в конце выполнения программы
}
_Ivana
2183 / 1388 / 124
Регистрация: 01.03.2013
Сообщений: 4,133
Записей в блоге: 2
28.07.2016, 20:45  [ТС]     Storage durations #5
DrOffset, офигеть! Кстати, начинаю припоминать, что и подобное читал... Но из-за отсутствия практики применения эта информация быстро выветрилась из оперативной памяти - типа автоматической области видимости: с глаз долой - из сердца мозга вон
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
28.07.2016, 20:52     Storage durations #6
Сообщение было отмечено автором темы, экспертом или модератором как ответ
В С++11 еще появился thread storage duration - объект создается на время жизни потока.
Stitch Igorek
 Аватар для Stitch Igorek
44 / 44 / 17
Регистрация: 02.04.2016
Сообщений: 300
Завершенные тесты: 1
28.07.2016, 21:21     Storage durations #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(). можно на примере кода это посмотреть =)
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
28.07.2016, 21:34     Storage durations #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' будет создаваться/уничтожаться для каждого потока.
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,233
28.07.2016, 22:08     Storage durations #9
Kastaneda, а вы использовали их? Есть какой-то супер профит или проблема которую можно решить только с ними.
hoggy
5225 / 2116 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
28.07.2016, 22:18     Storage durations #10
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Есть какой-то супер профит или проблема которую можно решить только с ними.
например - логгер в многопоточной среде.
логгер сам по себе - сингелтон:

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

ну или пришлось бы отказаться от глобальной переменной.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
28.07.2016, 22:25     Storage durations #11
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Kastaneda, а вы использовали их?
На практике не приходилось, просто необходимости не было.
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Есть какой-то супер профит или проблема которую можно решить только с ними.
Думаю безусловно есть, сходу пример придумать не могу, мозги спят уже, пол третьего ночи)
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,233
28.07.2016, 22:37     Storage durations #12
hoggy, разве объект log не пишет в файл и тем самым хоть объект защищён, но доступ к файлу врядли многопоточный.
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
28.07.2016, 22:42     Storage durations #13
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
разве объект log не пишет в файл и тем самым хоть объект защищён, но доступ к файлу врядли многопоточный.
Вот так можно перемешать данные
C++
1
log << "one" << "two;
в момент каждого << управление может передаться другому потоку.
Stitch Igorek
 Аватар для Stitch Igorek
44 / 44 / 17
Регистрация: 02.04.2016
Сообщений: 300
Завершенные тесты: 1
28.07.2016, 22:42     Storage durations #14
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
Есть какой-то супер профит или проблема которую можно решить только с ними.
Вот думаю при написании игр неплохо сэкономит ресурсы железа(гонять одни и те же данные по множеству функций даже по ссылкам или указателям, затрачивает память - эти указатели помещаются в стек. Использовать глобальные переменные, и работать с ними из функций - немного уменьшает затраты памяти, но усложняет написание многопоточного приложения(одни и те же глобальные переменные будут считаться в разных потоках и ничего хорошего из этого не выйдет), а тут "Эврика" - возможность создать свои "глобальные" переменные для каждого потока).
Может я конечно и не прав...
rikimaru2013
C++ Game Dev
 Аватар для rikimaru2013
2133 / 966 / 222
Регистрация: 30.11.2013
Сообщений: 3,233
28.07.2016, 22:44     Storage durations #15
Цитата Сообщение от Stitch Igorek Посмотреть сообщение
Использовать глобальные переменные
Цитата Сообщение от Stitch Igorek Посмотреть сообщение
Может я конечно и не прав...
Может? Как по мне очевидный пуш палки в колесо
hoggy
5225 / 2116 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
28.07.2016, 23:04     Storage durations #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 Посмотреть сообщение
а тут "Эврика" - возможность создать свои "глобальные" переменные для каждого потока).
Может я конечно и не прав...
нет. вы именно что правы.

в этом вся суть идеи - глобальные переменные,
свои для каждого потока.
Avazart
 Аватар для Avazart
6900 / 5140 / 252
Регистрация: 10.12.2010
Сообщений: 22,584
Записей в блоге: 17
28.07.2016, 23:15     Storage durations #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' будет создаваться/уничтожаться для каждого потока.
Чем это будет отличатся от обычного локального объекта созданного внутри ф-ции потока?
Только тем что стек не будет занимать?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4236 / 2769 / 218
Регистрация: 12.12.2009
Сообщений: 7,104
Записей в блоге: 1
Завершенные тесты: 1
29.07.2016, 08:58     Storage durations #18
Цитата Сообщение от Avazart Посмотреть сообщение
Только тем что стек не будет занимать?
Честно говоря в этом не уверен, возможно объект располагается на стеке потока, при этом виден из других ф-ций потока.
Operok
125 / 123 / 33
Регистрация: 15.02.2015
Сообщений: 386
Завершенные тесты: 2
29.07.2016, 10:01     Storage durations #19
hoggy, берём на вооружение данную обёртку над потоком. Надо было для демонстрации потоки при старте "усыпить" и разбудить "одновременно", например atomic_bool. А то поток создаётся дольше чем выполняется, т.е. к моменту запуска предыдущий уже своё отработал.
По поводу thread_local. Во многих библиотеках (как правило на Си), нужно производить некую инициализацию, при чём для каждого потока отдельно, сразу захотелось завернуть эту инициализацию в конструктор некого класса, скажем SomeLibThreadContext, и засунуть его в TLS через thread_local. Но не тут-то было... мало того что в mvc13 нет такого ключевого слова (__declspec(thread) вместо него), так и использовать можно только POD типы.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2016, 13:49     Storage durations
Еще ссылки по теме:

Софт Intel Rapid Storage
Thread Local Storage Java
Local Storage PHP БД

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

Или воспользуйтесь поиском по форуму:
hoggy
5225 / 2116 / 403
Регистрация: 15.11.2014
Сообщений: 4,800
Завершенные тесты: 1
29.07.2016, 13:49     Storage durations #20
Цитата Сообщение от Operok Посмотреть сообщение
мало того что в mvc13 нет такого ключевого слова (__declspec(thread) вместо него), так и использовать можно только POD типы.
делайте указатель,
и вешайте на него объекты любых типов.
Yandex
Объявления
29.07.2016, 13:49     Storage durations
Ответ Создать тему
Опции темы

Текущее время: 01:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru