Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32

Storage durations

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

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

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

File Storage
Необходимо работать с StorageFile, но никак не могу найти библиотеку, которую надо подключить. Подскажите, плз) Ошибка CS0246 Не...

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

32
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
29.07.2016, 14:14
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от hoggy Посмотреть сообщение
делайте указатель,
и вешайте на него объекты любых типов.
Можно, но только осторожно. То, на что он будет указывать, надо будет освобождать. Можно через map сделать, используя id потока как ключ, но суть в том что нельзя совместить RAII и thread_local из стандарта (по крайней мере под виндой).
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.07.2016, 14:22
Цитата Сообщение от Operok Посмотреть сообщение
То, на что он будет указывать, надо будет освобождать.
разумеется.
Цитата Сообщение от Operok Посмотреть сообщение
Можно через map сделать, используя id потока как ключ, но суть в том что нельзя совместить RAII и thread_local из стандарта (по крайней мере под виндой).
да не нужны никакие std::map
TLS уникально для каждого треда.
просто при торможении поток сам без всяких блокировок зачищает свой TLS

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

Цитата Сообщение от hoggy Посмотреть сообщение
Std::thread приостановка потока
ThreadPool писали, только не заморачивался с потокобезопасной очередью, блокировал весь std::queue. Я ещё добавил метод assist, который по сути как join, только вместо того чтобы просто ждать, он помогает разгрести очередь задач.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.07.2016, 15:02
Цитата Сообщение от Operok Посмотреть сообщение
Я похоже что-то не так понял, TLS - это набор "индексов"
это - обычная глобальная переменная, уникальная для треда.
в вашем случае - указатель

Цитата Сообщение от Operok Посмотреть сообщение
как поток почистит за нами?
перед завершением получит доступ к своему указателю и сделает delete,
очевидно жеж.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
29.07.2016, 15:56
Цитата Сообщение от 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
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.07.2016, 15:59
Цитата Сообщение от 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
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
29.07.2016, 16:11
Цитата Сообщение от hoggy Посмотреть сообщение
главное, что б вы знали, чего вы делаете.
В том-то и дело, что мне не известно, когда основная функция потока завершит свою работу. Поток будет создавать другой программист, он даже не будет сам обращаться к этой переменной.
Цитата Сообщение от hoggy Посмотреть сообщение
перед завершением получит доступ к своему указателю и сделает delete,
очевидно жеж.
как?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.07.2016, 16:16
Цитата Сообщение от Operok Посмотреть сообщение
В том-то и дело, что мне не известно, когда основная функция потока завершит свою работу.
выше я специально привел вам линк на учебный тред-пул,
что бы проиллюстрировать этот момент.

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

Не по теме:

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

0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
29.07.2016, 16:39
Цитата Сообщение от hoggy Посмотреть сообщение
выше я специально привел вам линк на учебный тред-пул,
что бы проиллюстрировать этот момент.
При чём тут это? Делать под библиотеку тред пул, и запрещать использовать любые другие потоки, если они как-то взаимодействуют с "моими" объектами?

Не по теме:

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



Добавлено через 1 минуту
Интересно всё жеж почему так происходит
Цитата Сообщение от Operok Посмотреть сообщение
В 2015-й студии уже есть thread_local, работающий с не POD типами, но как-то странно. Для того, чтобы thread_local объект создался в контексту потока, отличного от главного, нужно к нему обратиться, и объекты созданные в контексте потока (не основного) не уничтожаются (деструктор не был вызван).
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.07.2016, 16:57
Цитата Сообщение от 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
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
29.07.2016, 17:01
Цитата Сообщение от hoggy Посмотреть сообщение
ещё раз внимательно см #26
Вы сами вызываете delete, а не поток, я уже предложил сойтись на том, что мы не поняли друг друга, но вы продолжаете.
Цитата Сообщение от hoggy Посмотреть сообщение
если вы при этом жалуетесь, что отсталая студия не тянет полноценное тлс,
стало быть - это ваши личные трудности.
Были мои, но вы решили мне "помочь", разбираемся теперь.
Цитата Сообщение от hoggy Посмотреть сообщение
при том, что он иллюстрирует стратегию зачистки тлс.
В упор не вижу. Обычный тред пул: вектор потоков, очередь задач, условные переменные, куча мьютексов и пара флагов.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
29.07.2016, 17:07
Цитата Сообщение от 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,
то у вас уже нет выбора.
вам придется использовать сырые указатели,
нравится вам это, или нет.
0
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
29.07.2016, 17:23
Цитата Сообщение от hoggy Посмотреть сообщение
а вы что думали?
что "поток" сам свой собственный исходный код писать будет?
Именно так я и прочитал ваше сообщение, проехали
Цитата Сообщение от hoggy Посмотреть сообщение
фрагмент из main.cpp
Вот в коменты не вчитывался, сорри. Но это не решение, так как в моём случае подразумевается безопасное использование классов в многопоточной программе, не ограниченное вариантами используемых потоков.
Цитата Сообщение от hoggy Посмотреть сообщение
однако ваше описание не соответствует действительности.
В самом деле я немного был не прав, так как я экспериментировал не с std::thread, а с std::async (с флагом std::launch::async). Вот и зависимость от типа используемого потока, даже в рамках стандарта
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.07.2016, 17:23

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи. Через несколько переработок от PHP кода к C89 (надеюсь, 89). Но довольно запутанно получилось. Код для Linux. Но если убрать time и то, что с ним. . .
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
rest api anylogic - выполнение модели на своём русском сайте
anaschu 02.07.2026
Как подружиться с AnyLogic Cloud API, победить провайдеров и развернуться Java-бэкенд в Docker на бесплатном хостинге: Двухдневный лог борьбы Всем привет! Хочу поделиться свежим (и довольно. . .
Где деньги лежат
kumehtar 02.07.2026
Это - японская подводная лодка I-52 (тип C2, кодовое имя Momi) вышла из Японии в марте 1944 года с миссией в оккупированную немцами Францию (Лорьян). Это была одна из «Янаги»-миссий по обмену. . .
Krabik для WoW 3.3.5a, многоязычный
AmbA 02.07.2026
Допилил бота, думаю что окончательно. Изменения: - добавлена многоязычность - добавлено снятие скриншотов - добавлено поддержание бафов хождения по воде (для жреца, дк и шамана) - и так, по. . .
Алиса нашла кучу ошибок компиляции и запуска в проекте, который без проблем компилировался и запускался)))
anaschu 30.06.2026
Я пока посмеюся, но завтра проверю. А вообще интерсно. Дал алисе файл, в котором точно нет ошибок компиляции и запуска, и попросил их найти. Нашла кучу))) Критические ошибки, мешающие компиляции и. . .
сукцессия 16. Общий обзор, в основном что бы другие ии поняли
anaschu 29.06.2026
# Передаточный документ: модель микоризной сукцессии (для нового чата) Этот документ предназначен для того, чтобы новый чат Claude мог продолжить работу без необходимости заново разбираться в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru