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

Storage durations - C++

Восстановить пароль Регистрация
 
 
_Ivana
2185 / 1390 / 124
Регистрация: 01.03.2013
Сообщений: 4,141
Записей в блоге: 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
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Operok
125 / 123 / 33
Регистрация: 15.02.2015
Сообщений: 386
Завершенные тесты: 2
29.07.2016, 14:14     Storage durations #21
Цитата Сообщение от hoggy Посмотреть сообщение
делайте указатель,
и вешайте на него объекты любых типов.
Можно, но только осторожно. То, на что он будет указывать, надо будет освобождать. Можно через map сделать, используя id потока как ключ, но суть в том что нельзя совместить RAII и thread_local из стандарта (по крайней мере под виндой).
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
29.07.2016, 14:22     Storage durations #22
Цитата Сообщение от Operok Посмотреть сообщение
То, на что он будет указывать, надо будет освобождать.
разумеется.
Цитата Сообщение от Operok Посмотреть сообщение
Можно через map сделать, используя id потока как ключ, но суть в том что нельзя совместить RAII и thread_local из стандарта (по крайней мере под виндой).
да не нужны никакие std::map
TLS уникально для каждого треда.
просто при торможении поток сам без всяких блокировок зачищает свой TLS

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

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

Цитата Сообщение от Operok Посмотреть сообщение
как поток почистит за нами?
перед завершением получит доступ к своему указателю и сделает delete,
очевидно жеж.
Operok
125 / 123 / 33
Регистрация: 15.02.2015
Сообщений: 386
Завершенные тесты: 2
29.07.2016, 15:56     Storage durations #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 объект создался в контексту потока, отличного от главного, нужно к нему обратиться, и объекты созданные в контексте потока (не основного) не уничтожаются (деструктор не был вызван).
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
29.07.2016, 15:59     Storage durations #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;
}
Operok
125 / 123 / 33
Регистрация: 15.02.2015
Сообщений: 386
Завершенные тесты: 2
29.07.2016, 16:11     Storage durations #27
Цитата Сообщение от hoggy Посмотреть сообщение
главное, что б вы знали, чего вы делаете.
В том-то и дело, что мне не известно, когда основная функция потока завершит свою работу. Поток будет создавать другой программист, он даже не будет сам обращаться к этой переменной.
Цитата Сообщение от hoggy Посмотреть сообщение
перед завершением получит доступ к своему указателю и сделает delete,
очевидно жеж.
как?
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
29.07.2016, 16:16     Storage durations #28
Цитата Сообщение от Operok Посмотреть сообщение
В том-то и дело, что мне не известно, когда основная функция потока завершит свою работу.
выше я специально привел вам линк на учебный тред-пул,
что бы проиллюстрировать этот момент.

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

Не по теме:

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

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

Не по теме:

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



Добавлено через 1 минуту
Интересно всё жеж почему так происходит
Цитата Сообщение от Operok Посмотреть сообщение
В 2015-й студии уже есть thread_local, работающий с не POD типами, но как-то странно. Для того, чтобы thread_local объект создался в контексту потока, отличного от главного, нужно к нему обратиться, и объекты созданные в контексте потока (не основного) не уничтожаются (деструктор не был вызван).
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
29.07.2016, 16:57     Storage durations #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;
}
Operok
125 / 123 / 33
Регистрация: 15.02.2015
Сообщений: 386
Завершенные тесты: 2
29.07.2016, 17:01     Storage durations #31
Цитата Сообщение от hoggy Посмотреть сообщение
ещё раз внимательно см #26
Вы сами вызываете delete, а не поток, я уже предложил сойтись на том, что мы не поняли друг друга, но вы продолжаете.
Цитата Сообщение от hoggy Посмотреть сообщение
если вы при этом жалуетесь, что отсталая студия не тянет полноценное тлс,
стало быть - это ваши личные трудности.
Были мои, но вы решили мне "помочь", разбираемся теперь.
Цитата Сообщение от hoggy Посмотреть сообщение
при том, что он иллюстрирует стратегию зачистки тлс.
В упор не вижу. Обычный тред пул: вектор потоков, очередь задач, условные переменные, куча мьютексов и пара флагов.
hoggy
5228 / 2119 / 403
Регистрация: 15.11.2014
Сообщений: 4,806
Завершенные тесты: 1
29.07.2016, 17:07     Storage durations #32
Цитата Сообщение от Operok Посмотреть сообщение
Вы сами вызываете delete, а не поток
а вы что думали?
что "поток" сам свой собственный исходный код писать будет?

Цитата Сообщение от Operok Посмотреть сообщение
В упор не вижу.
фрагмент из main.cpp
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
// --- эту функцию будем вызывать для каждого потока
// в момент его завершения
void Stop()
{
    const auto id
        = std::this_thread::get_id();
    service::AStream() << "[" << id << "] finished\n";
}
 
// --- последняя задача для тред-пула
// она должна просигналить пулу о том,
// что нужно остановиться
void Finish()
{
    service::AStream() << "[ALL TASK FINISHED]\n";
 
    // --- иногда по факту завершению работы потока
    // необходимо выполнить дополнительную функцию-зачистки
    // например, если требуется доступ к TLS (thread local storage) данным
    // в этом случае можно указать дополнительную функцию
    // которая будет вызвана для каждого остановившегося потока
 
    // если такая зачистка не нужна
    // то можно вызвать Stop() без аргументов
    service::ThreadPool::Get().Stop(::Stop);
}
Цитата Сообщение от Operok Посмотреть сообщение
Были мои, но вы решили мне "помочь", разбираемся теперь.
если у вас отсталая студия, которая не поддерживает стандартный tls,
то у вас уже нет выбора.
вам придется использовать сырые указатели,
нравится вам это, или нет.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.07.2016, 17:23     Storage durations
Еще ссылки по теме:

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

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

Или воспользуйтесь поиском по форуму:
Operok
125 / 123 / 33
Регистрация: 15.02.2015
Сообщений: 386
Завершенные тесты: 2
29.07.2016, 17:23     Storage durations #33
Цитата Сообщение от hoggy Посмотреть сообщение
а вы что думали?
что "поток" сам свой собственный исходный код писать будет?
Именно так я и прочитал ваше сообщение, проехали
Цитата Сообщение от hoggy Посмотреть сообщение
фрагмент из main.cpp
Вот в коменты не вчитывался, сорри. Но это не решение, так как в моём случае подразумевается безопасное использование классов в многопоточной программе, не ограниченное вариантами используемых потоков.
Цитата Сообщение от hoggy Посмотреть сообщение
однако ваше описание не соответствует действительности.
В самом деле я немного был не прав, так как я экспериментировал не с std::thread, а с std::async (с флагом std::launch::async). Вот и зависимость от типа используемого потока, даже в рамках стандарта
Yandex
Объявления
29.07.2016, 17:23     Storage durations
Ответ Создать тему
Опции темы

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