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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
_Ivana
3149 / 1777 / 152
Регистрация: 01.03.2013
Сообщений: 4,981
Записей в блоге: 2
#1

Storage durations - C++

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

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

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

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

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

Internal storage - Программирование Android
У меня есть 2 телефона: Samsung ace2 и HTC One V. На первом стоит андроид 2.3, на втором 4.0.3 Мне нужно писать данные в файл. Этот...

Не работает storage.sort() - Python
Не пойму в чем дело. Вроде меняет первоначальную структуру, но не до конца. class Stack: def __init__(self): self.storage...

VK API метод storage.get - ActionScript
Пытаюсь сделать приложение, в котором устанавливаю переменную методом storage.set, а потом получаю методом storage.get ее и вывожу в...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
hoggy
Нарушитель
6588 / 2769 / 476
Регистрация: 15.11.2014
Сообщений: 6,119
Завершенные тесты: 1
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
Эксперт С++
7191 / 5365 / 280
Регистрация: 10.12.2010
Сообщений: 23,672
Записей в блоге: 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
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
29.07.2016, 08:58 #18
Цитата Сообщение от Avazart Посмотреть сообщение
Только тем что стек не будет занимать?
Честно говоря в этом не уверен, возможно объект располагается на стеке потока, при этом виден из других ф-ций потока.
0
Operok
151 / 149 / 43
Регистрация: 15.02.2015
Сообщений: 435
Завершенные тесты: 2
29.07.2016, 10:01 #19
hoggy, берём на вооружение данную обёртку над потоком. Надо было для демонстрации потоки при старте "усыпить" и разбудить "одновременно", например atomic_bool. А то поток создаётся дольше чем выполняется, т.е. к моменту запуска предыдущий уже своё отработал.
По поводу thread_local. Во многих библиотеках (как правило на Си), нужно производить некую инициализацию, при чём для каждого потока отдельно, сразу захотелось завернуть эту инициализацию в конструктор некого класса, скажем SomeLibThreadContext, и засунуть его в TLS через thread_local. Но не тут-то было... мало того что в mvc13 нет такого ключевого слова (__declspec(thread) вместо него), так и использовать можно только POD типы.
0
hoggy
Нарушитель
6588 / 2769 / 476
Регистрация: 15.11.2014
Сообщений: 6,119
Завершенные тесты: 1
29.07.2016, 13:49 #20
Цитата Сообщение от Operok Посмотреть сообщение
мало того что в mvc13 нет такого ключевого слова (__declspec(thread) вместо него), так и использовать можно только POD типы.
делайте указатель,
и вешайте на него объекты любых типов.
0
Operok
151 / 149 / 43
Регистрация: 15.02.2015
Сообщений: 435
Завершенные тесты: 2
29.07.2016, 14:14 #21
Цитата Сообщение от hoggy Посмотреть сообщение
делайте указатель,
и вешайте на него объекты любых типов.
Можно, но только осторожно. То, на что он будет указывать, надо будет освобождать. Можно через map сделать, используя id потока как ключ, но суть в том что нельзя совместить RAII и thread_local из стандарта (по крайней мере под виндой).
0
hoggy
Нарушитель
6588 / 2769 / 476
Регистрация: 15.11.2014
Сообщений: 6,119
Завершенные тесты: 1
29.07.2016, 14:22 #22
Цитата Сообщение от Operok Посмотреть сообщение
То, на что он будет указывать, надо будет освобождать.
разумеется.
Цитата Сообщение от Operok Посмотреть сообщение
Можно через map сделать, используя id потока как ключ, но суть в том что нельзя совместить RAII и thread_local из стандарта (по крайней мере под виндой).
да не нужны никакие std::map
TLS уникально для каждого треда.
просто при торможении поток сам без всяких блокировок зачищает свой TLS

Std::thread приостановка потока
1
Operok
151 / 149 / 43
Регистрация: 15.02.2015
Сообщений: 435
Завершенные тесты: 2
29.07.2016, 14:59 #23
Цитата Сообщение от hoggy Посмотреть сообщение
TLS уникально для каждого треда.
просто при торможении поток сам без всяких блокировок зачищает свой TLS
Я похоже что-то не так понял, TLS - это набор "индексов" (TLS_MINIMUM_AVAILABLE штук) типа LPVOID, в которых мы храним указатели на память выделенную в "куче" (привет ТС), так? Если да, то как поток почистит за нами?

Цитата Сообщение от hoggy Посмотреть сообщение
Std::thread приостановка потока
ThreadPool писали, только не заморачивался с потокобезопасной очередью, блокировал весь std::queue. Я ещё добавил метод assist, который по сути как join, только вместо того чтобы просто ждать, он помогает разгрести очередь задач.
0
hoggy
Нарушитель
6588 / 2769 / 476
Регистрация: 15.11.2014
Сообщений: 6,119
Завершенные тесты: 1
29.07.2016, 15:02 #24
Цитата Сообщение от Operok Посмотреть сообщение
Я похоже что-то не так понял, TLS - это набор "индексов"
это - обычная глобальная переменная, уникальная для треда.
в вашем случае - указатель

Цитата Сообщение от Operok Посмотреть сообщение
как поток почистит за нами?
перед завершением получит доступ к своему указателю и сделает delete,
очевидно жеж.
0
Operok
151 / 149 / 43
Регистрация: 15.02.2015
Сообщений: 435
Завершенные тесты: 2
29.07.2016, 15:56 #25
Цитата Сообщение от hoggy Посмотреть сообщение
перед завершением получит доступ к своему указателю и сделает delete,
очевидно жеж.
C++
1
2
3
4
5
6
7
8
__declspec(thread) MyClass* tls_ptr = nullptr;
...
void SomeThreadFunc()
{
    if (!tls_ptr) 
        tls_ptr = new MyClass();
    ...
}
Функция SomeThreadFunc далеко не последняя в потоке, поток создавать буду не я. Откуда поток знает что я "положил" в конкретную TLS переменную?
В 2015-й студии уже есть thread_local, работающий с не POD типами, но как-то странно. Для того, чтобы thread_local объект создался в контексту потока, отличного от главного, нужно к нему обратиться, и объекты созданные в контексте потока (не основного) не уничтожаются (деструктор не был вызван).
0
hoggy
Нарушитель
6588 / 2769 / 476
Регистрация: 15.11.2014
Сообщений: 6,119
Завершенные тесты: 1
29.07.2016, 15:59 #26
Цитата Сообщение от Operok Посмотреть сообщение
Откуда поток знает что я "положил" в конкретную TLS переменную?
главное, что б вы знали, чего вы делаете.

C++
1
2
3
4
5
6
7
8
9
10
__declspec(thread) MyClass* tls_ptr = nullptr;
...
void SomeThreadFunc()
{
    if (!tls_ptr) 
        tls_ptr = new MyClass();
    ...
 
    delete tls_ptr;
}
0
Operok
151 / 149 / 43
Регистрация: 15.02.2015
Сообщений: 435
Завершенные тесты: 2
29.07.2016, 16:11 #27
Цитата Сообщение от hoggy Посмотреть сообщение
главное, что б вы знали, чего вы делаете.
В том-то и дело, что мне не известно, когда основная функция потока завершит свою работу. Поток будет создавать другой программист, он даже не будет сам обращаться к этой переменной.
Цитата Сообщение от hoggy Посмотреть сообщение
перед завершением получит доступ к своему указателю и сделает delete,
очевидно жеж.
как?
0
hoggy
Нарушитель
6588 / 2769 / 476
Регистрация: 15.11.2014
Сообщений: 6,119
Завершенные тесты: 1
29.07.2016, 16:16 #28
Цитата Сообщение от Operok Посмотреть сообщение
В том-то и дело, что мне не известно, когда основная функция потока завершит свою работу.
выше я специально привел вам линк на учебный тред-пул,
что бы проиллюстрировать этот момент.

Цитата Сообщение от Operok Посмотреть сообщение
как?
см #26

Не по теме:

вы что, никогда с new/delete что ли не работали?

0
Operok
151 / 149 / 43
Регистрация: 15.02.2015
Сообщений: 435
Завершенные тесты: 2
29.07.2016, 16:39 #29
Цитата Сообщение от hoggy Посмотреть сообщение
выше я специально привел вам линк на учебный тред-пул,
что бы проиллюстрировать этот момент.
При чём тут это? Делать под библиотеку тред пул, и запрещать использовать любые другие потоки, если они как-то взаимодействуют с "моими" объектами?

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
вы что, никогда с new/delete что ли не работали?
с недавнего времени завязал с этим, только make_unique/make_shared
Цитата Сообщение от hoggy Посмотреть сообщение
перед завершением получит доступ к своему указателю и сделает delete,
как поток сам вызовет delete? Можно не отвечать, мы друг друга не поняли, хоть я и спрашивал
Цитата Сообщение от Operok Посмотреть сообщение
Если да, то как поток почистит за нами?



Добавлено через 1 минуту
Интересно всё жеж почему так происходит
Цитата Сообщение от Operok Посмотреть сообщение
В 2015-й студии уже есть thread_local, работающий с не POD типами, но как-то странно. Для того, чтобы thread_local объект создался в контексту потока, отличного от главного, нужно к нему обратиться, и объекты созданные в контексте потока (не основного) не уничтожаются (деструктор не был вызван).
0
hoggy
Нарушитель
6588 / 2769 / 476
Регистрация: 15.11.2014
Сообщений: 6,119
Завершенные тесты: 1
29.07.2016, 16:57 #30
Цитата Сообщение от Operok Посмотреть сообщение
При чём тут это?
при том, что он иллюстрирует стратегию зачистки тлс.

Цитата Сообщение от Operok Посмотреть сообщение
Делать под библиотеку тред пул, и запрещать использовать любые другие потоки, если они как-то взаимодействуют с "моими" объектами?
да как хотите, так и делайте.
чего вам ещё не понятно?

Цитата Сообщение от Operok Посмотреть сообщение
с недавнего времени завязал с этим, только unique_ptr/shared_ptr
если вы при этом жалуетесь, что отсталая студия не тянет полноценное тлс,
стало быть - это ваши личные трудности.

Цитата Сообщение от Operok Посмотреть сообщение
как поток сам вызовет delete?
ещё раз внимательно см #26

если останутся какие то вопросы,
значит вам нужно подучить с++,
тему: new/delete

Добавлено через 11 минут
Цитата Сообщение от Operok Посмотреть сообщение
Интересно всё жеж почему так происходит
хз, что именно вы там творите.

однако ваше описание не соответствует действительности.

http://rextester.com/FXU60916

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
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#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;
 
 
 
//------------------------------------------------------
 
 
#define dME \
    " -----------------------------> "   \
    "sample(" << std::this_thread::get_id() << ")"
 
struct sample {
    sample() { AStream() << dME " was build"     << std::endl; }
   ~sample() { AStream() << dME " was destroyed" << std::endl; }
};
 
#undef dME
 
thread_local sample gObj;
 
 
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<5; ++n)
        atomic_print(name, n);
    
    AStream() << "thread(" << std::this_thread::get_id() << ") "<< name
        << " was finished!"
        << std::endl;
}
 
 
 
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;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2016, 16:57
Привет! Вот еще темы с ответами:

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

HTML5 Database storage - HTML, CSS
Если кто нибудь пользовался данной штукой, то собственно вопрос. Где находятся дынные физически? Т.Е. Я создаю базу данных, заполняю...

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.07.2016, 16:57
Ответ Создать тему
Опции темы

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