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

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

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



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


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

Зато код не запутан: не надо выше на два уровня по стеку хранить значение предыдущего значения и дважды вглубь его по ссылке передвать... Мало кто поймет это извращение.
...
Рейтинг: 0 / 0
08.01.2018, 13:47
    #39580527
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ведет себя static переменная функции в многопоточной программе?
Почему- то при присваивании значения подобной переменной программа вылетает с ошибкой:
Код: 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
08.01.2018, 13:52
    #39580532
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ведет себя static переменная функции в многопоточной программе?
AlekseySQLпрограмма вылетает с ошибкой

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

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

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

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

Ошибка выглядит так: "Приложение получило сигнал от операционной системы и будет закрыто". По поведению очень похоже на ошибку работы с памятью, причем когда я работаю без stаstic- переменной (с помощью передачи в функцию ссылки на предыдущее значение), то никаких ошибок не происодит и программа удачно завершается. Так что ошибка не в остальном коде программы, а именно в работе со static- переменной.
...
Рейтинг: 0 / 0
08.01.2018, 16:01
    #39580572
Andrej_f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ведет себя static переменная функции в многопоточной программе?
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
08.01.2018, 16:17
    #39580579
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ведет себя static переменная функции в многопоточной программе?
AlekseySQLОшибка выглядит так: "Приложение получило сигнал от операционной системы и будет закрыто".

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



Если надо чтобы во всех потоках был один и тот же счетчик:
Код: plaintext
1.
static std::atomic<uint64_t> PreviousNumber(0);
...
Рейтинг: 0 / 0
08.01.2018, 20:10
    #39580664
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ведет себя static переменная функции в многопоточной программе?
Вася УткинЕсли надо, чтобы в каждом потоке был отдельный счетчик:
Код: 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
08.01.2018, 20:34
    #39580675
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ведет себя static переменная функции в многопоточной программе?
Вроде так должно быть, без static
Код: plaintext
1.
thread_local ullong PreviousNumber;



У меня работает везде, кроме DLL под XP, там есть проблема с TLS.
...
Рейтинг: 0 / 0
08.01.2018, 21:04
    #39580688
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ведет себя static переменная функции в многопоточной программе?
На всякий случай:
thread_local это не одна переменная, а по одной на каждый поток, т.е. переменных столько, сколько потоков. Может все-таки речь про обычный static ? Про то и другое уже написали 21088084
...
Рейтинг: 0 / 0
09.01.2018, 00:01
    #39580754
Вася Уткин
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ведет себя static переменная функции в многопоточной программе?
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
09.01.2018, 00:19
    #39580757
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ведет себя static переменная функции в многопоточной программе?
AlekseySQLЕсть функция, которая возвращает непрерывность параметра. Т.е.
ей передали 1, она вернула false (первое значение очевидно не непрерывно)
ей передали 2, она вернула true
ей передали 3, она вернула true
ей передали 5, она вернула false
ей передали 6, она вернула true
...

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

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


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

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

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


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

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

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

Ок, а в таком случае можно гарантировать минимальное / максимальное значение хранимое в этих типах? Или это получается как принцип Гейзенберга: либо гарантируем размер на диске (*_t типы), либо гарантируем размер хранимого значения (обычные типы из С), а одновременно дать обе гарантии нельзя?
...
Рейтинг: 0 / 0
09.01.2018, 12:45
    #39580977
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ведет себя static переменная функции в многопоточной программе?
Для целых чисел размер на диске определяет мин/макс значение:
Беззнаковые 0 ... 2^N
Знаковые -2^N-1 ... 2^N-1
...
Рейтинг: 0 / 0
09.01.2018, 12:57
    #39580991
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ведет себя static переменная функции в многопоточной программе?
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
09.01.2018, 23:49
    #39581372
ptr128
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ведет себя static переменная функции в многопоточной программе?
AlekseySQLХочется внутри этой функции сохранять предыдущее значение с помощью static- переменной.
Не люблю статические переменные. Проще первым параметром передавать функции указатель на на некий хендл. Если значение хендла NULL, то это первый вызов и функция сама выделит память и поместит указатель на нее в хендл. При последующих вызовах функция будет использовать эту выделенную память по своему усмотрению.
Можно так же передавать сразу хендл, а не указатель на него. Но тогда понадобится еще функция инициализации этого хендла. Ну как аналог open() перед read().
...
Рейтинг: 0 / 0
10.01.2018, 00:26
    #39581376
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как ведет себя static переменная функции в многопоточной программе?
AlekseySQLВася УткинДа, uint64_t, ... - ввели для четкого понимания его размера, для бинарной совместимости и надежности кода.
Когда используют short, int, long, long long ... - то оттестировав на одной архитектуре, потом ловят баги переполнения на другой.
Когда я точно знаю, что там значения будут очень мелкими, то использую int.

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



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



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

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


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