powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как ведет себя static переменная функции в многопоточной программе?
25 сообщений из 27, страница 1 из 2
Как ведет себя static переменная функции в многопоточной программе?
    #39580496
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть функция, которая возвращает непрерывность параметра. Т.е.
ей передали 1, она вернула false (первое значение очевидно не непрерывно)
ей передали 2, она вернула true
ей передали 3, она вернула true
ей передали 5, она вернула false
ей передали 6, она вернула true
...

Хочется внутри этой функции сохранять предыдущее значение с помощью static- переменной. Но в инете не нашел ничего толкового по поведению static- переменных в многопоточной программе.

Что скажет стая?
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580500
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нашел новые возможности С++:
Код: plaintext
1.
static thread_local int PreviousNumber;



Если я потоки создал с помощью Qt, то по логике тоже должно взлететь. Кто- нибудь пробовал такие возможности? Какие подводные камни (производительность не падает)?
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580501
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot AlekseySQL]нашел новые возможности С++:
Код: plaintext
1.
static thread_local int PreviousNumber;


Делать функции с static-параметром - это не круто. Вобщем.. лучше это как-то переоформить.
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580506
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
maytonДелать функции с static-параметром - это не круто. Вобщем.. лучше это как-то переоформить.

Зато код не запутан: не надо выше на два уровня по стеку хранить значение предыдущего значения и дважды вглубь его по ссылке передвать... Мало кто поймет это извращение.
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580527
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почему- то при присваивании значения подобной переменной программа вылетает с ошибкой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
inline char GetContinuousNumber(ullong Number)
{
        static thread_local ullong PreviousNumber;

        if(Number - PreviousNumber == 1)
        {
            PreviousNumber = Number; //ОШИБКА!!!
            return 1;
        }
        else
        {
            PreviousNumber = Number; //ОШИБКА!!!
            return 0;
        }
}
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580532
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLпрограмма вылетает с ошибкой

И эта ошибка "красненькая" или "многа нипанятных букафф"?

inline для начала убери.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580533
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

Так прямо и пишет: "ОШИБКА!!!" ? )))
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580561
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly MoskovskyAlekseySQL,

Так прямо и пишет: "ОШИБКА!!!" ? )))

Ошибка выглядит так: "Приложение получило сигнал от операционной системы и будет закрыто". По поведению очень похоже на ошибку работы с памятью, причем когда я работаю без stаstic- переменной (с помощью передачи в функцию ссылки на предыдущее значение), то никаких ошибок не происодит и программа удачно завершается. Так что ошибка не в остальном коде программы, а именно в работе со static- переменной.
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580572
Andrej_f
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLПочему- то при присваивании значения подобной переменной программа вылетает с ошибкой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
inline char GetContinuousNumber(ullong Number)
{
        static thread_local ullong PreviousNumber;

        if(Number - PreviousNumber == 1)
        {
            PreviousNumber = Number; //ОШИБКА!!!
            return 1;
        }
        else
        {
            PreviousNumber = Number; //ОШИБКА!!!
            return 0;
        }
}

Такой переменной должно быть присвоено значение при объявлении, кажется:
Код: plaintext
1.
static thread_local ullong PreviousNumber = 0;
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580579
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLОшибка выглядит так: "Приложение получило сигнал от операционной системы и будет закрыто".

Там ещё кнопочка подробностей обычно прилагается к такому сообщению. И возможность
запустить отладчик. Очень полезная.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580621
Фотография CEMb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLПо поведению очень похоже на ошибку работы с памятью, причем когда я работаю без stаstic- переменной (с помощью передачи в функцию ссылки на предыдущее значение), то никаких ошибок не происодит и программа удачно завершается.
«Что-то ты, Герасим, недоговариваешь...» © Муму
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580627
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут по смыслу - не функция а объект с состоянием. Если так сделать то и в потоки
его вставлять удобно и конфликтов не будет.
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580659
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если надо, чтобы в каждом потоке был отдельный счетчик:
Код: plaintext
1.
static thread_local uint64_t PreviousNumber = 0;



Если надо чтобы во всех потоках был один и тот же счетчик:
Код: plaintext
1.
static std::atomic<uint64_t> PreviousNumber(0);
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580664
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вася УткинЕсли надо, чтобы в каждом потоке был отдельный счетчик:
Код: plaintext
1.
static thread_local uint64_t PreviousNumber = 0;



Если надо чтобы во всех потоках был один и тот же счетчик:
Код: plaintext
1.
static std::atomic<uint64_t> PreviousNumber(0);



Спасибо, завтра проверю! Я правильно понимаю, что типы данных с постфиксом _t были введены в С++ 11 чтобы снять вопрос платформо- зависимости размера в памяти? Другими словами, если предполагается использовать программу на разных платформах, то лучше использовать эти типы, а не стандартные int, long, long long?
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580675
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде так должно быть, без static
Код: plaintext
1.
thread_local ullong PreviousNumber;



У меня работает везде, кроме DLL под XP, там есть проблема с TLS.
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580688
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На всякий случай:
thread_local это не одна переменная, а по одной на каждый поток, т.е. переменных столько, сколько потоков. Может все-таки речь про обычный static ? Про то и другое уже написали 21088084
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580754
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AlekseySQLВася УткинЕсли надо, чтобы в каждом потоке был отдельный счетчик:
Код: plaintext
1.
static thread_local uint64_t PreviousNumber = 0;



Если надо чтобы во всех потоках был один и тот же счетчик:
Код: plaintext
1.
static std::atomic<uint64_t> PreviousNumber(0);



Спасибо, завтра проверю! Я правильно понимаю, что типы данных с постфиксом _t были введены в С++ 11 чтобы снять вопрос платформо- зависимости размера в памяти? Другими словами, если предполагается использовать программу на разных платформах, то лучше использовать эти типы, а не стандартные int, long, long long?
Да, uint64_t, ... - ввели для четкого понимания его размера, для бинарной совместимости и надежности кода.
Когда используют short, int, long, long long ... - то оттестировав на одной архитектуре, потом ловят баги переполнения на другой.
Когда я точно знаю, что там значения будут очень мелкими, то использую int.

ullong - такого типа нет, это надо пользовательский определять.
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580757
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLЕсть функция, которая возвращает непрерывность параметра. Т.е.
ей передали 1, она вернула false (первое значение очевидно не непрерывно)
ей передали 2, она вернула true
ей передали 3, она вернула true
ей передали 5, она вернула false
ей передали 6, она вернула true
...

Хочется внутри этой функции сохранять предыдущее значение с помощью static- переменной. Но в инете не нашел ничего толкового по поведению static- переменных в многопоточной программе.

Что скажет стая?


static переменная одна, потоков много... работать не может в принципе.

такой дизайн функции задуман как нереэнтерантный. это плохо

для работы функции в таком виде нужно применять сохранение состояния в переменных, хранимых в thread local storage. при этом не обязательно , чтобы это была статическая переменная функции.


ещё лучше было бы изменить дизайн функции таким образом, чтобы хранил состояние и передавал его ви функцию клиент этой функции.
тогда не нужно было бы хранить ничего в thread local storage (применение которого безусловно является ужасно плохим архитектурным решением)
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580760
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLmaytonДелать функции с static-параметром - это не круто. Вобщем.. лучше это как-то переоформить.

Зато код не запутан: не надо выше на два уровня по стеку хранить значение предыдущего значения и дважды вглубь его по ссылке передвать... Мало кто поймет это извращение.

сделай это классом, и никто даже слова не скажет... просто даже никто не поймет.
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580973
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вася УткинДа, uint64_t, ... - ввели для четкого понимания его размера, для бинарной совместимости и надежности кода.
Когда используют short, int, long, long long ... - то оттестировав на одной архитектуре, потом ловят баги переполнения на другой.
Когда я точно знаю, что там значения будут очень мелкими, то использую int.

Ок, а в таком случае можно гарантировать минимальное / максимальное значение хранимое в этих типах? Или это получается как принцип Гейзенберга: либо гарантируем размер на диске (*_t типы), либо гарантируем размер хранимого значения (обычные типы из С), а одновременно дать обе гарантии нельзя?
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580977
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для целых чисел размер на диске определяет мин/макс значение:
Беззнаковые 0 ... 2^N
Знаковые -2^N-1 ... 2^N-1
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39580991
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLлибо гарантируем размер на диске (*_t типы), либо гарантируем размер хранимого значения (обычные типы из С), а одновременно дать обе гарантии нельзя?
Проблема в том что обычные типы гарантируют минимально-возможное значение
https://ru.wikipedia.org/wiki/Типы_данных_в_C Реальный размер целочисленных типов зависит от реализации. Стандарт лишь оговаривает отношения в размерах между типами и минимальные рамки для каждого типа:

Так long long не должен быть меньше long, который в свою очередь не должен быть меньше int, который в свою очередь не должен быть меньше short. Так как char — наименьший из возможных адресуемых типов, другие типы не могут иметь размер меньше него.

Минимальный размер для char — 8 бит, для short и int — 16 бит, для long — 32 бита, для long long — 64 бита.

Желательно, чтобы тип int был таким целочисленным типом, с которым наиболее эффективно работает процессор. Это позволяет достигать высокой гибкости, например, все типы могут занимать 64 бита. Однако, есть популярные схемы, описывающие размеры целочисленных типов.[7]

На практике это означает, что char занимает 8 бит, а short 16 бит (также, как и их беззнаковые аналоги). int на большинстве современных платформ занимает 32 бита, а long long 64 бита. Длина long варьируется: для Windows это 32 бита, для UNIX-подобных систем — 64 бита.
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39581372
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLХочется внутри этой функции сохранять предыдущее значение с помощью static- переменной.
Не люблю статические переменные. Проще первым параметром передавать функции указатель на на некий хендл. Если значение хендла NULL, то это первый вызов и функция сама выделит память и поместит указатель на нее в хендл. При последующих вызовах функция будет использовать эту выделенную память по своему усмотрению.
Можно так же передавать сразу хендл, а не указатель на него. Но тогда понадобится еще функция инициализации этого хендла. Ну как аналог open() перед read().
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39581376
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLВася УткинДа, uint64_t, ... - ввели для четкого понимания его размера, для бинарной совместимости и надежности кода.
Когда используют short, int, long, long long ... - то оттестировав на одной архитектуре, потом ловят баги переполнения на другой.
Когда я точно знаю, что там значения будут очень мелкими, то использую int.

Ок, а в таком случае можно гарантировать минимальное / максимальное значение хранимое в этих типах? Или это получается как принцип Гейзенберга: либо гарантируем размер на диске (*_t типы), либо гарантируем размер хранимого значения (обычные типы из С), а одновременно дать обе гарантии нельзя?
В тему пользы сериализации. Помимо разрядности есть еще и порядок байт в машинном слове.
Little/Big endian называется. И об этом аспекте голова болит когда нужно обеспечить миграцию
бинарника (данных) с одного железа на доругое.
...
Рейтинг: 0 / 0
Как ведет себя static переменная функции в многопоточной программе?
    #39583651
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вася УткинЕсли надо, чтобы в каждом потоке был отдельный счетчик:
Код: plaintext
1.
static thread_local uint64_t PreviousNumber = 0;



Если надо чтобы во всех потоках был один и тот же счетчик:
Код: plaintext
1.
static std::atomic<uint64_t> PreviousNumber(0);



Спасибо, взлетело!

p.s. На работе был пожар, потому долго не мог проверить.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как ведет себя static переменная функции в многопоточной программе?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]