Page 1 of 1

cutecode, Ну и где вопрос про треды?

Posted: Mon Jan 06, 2020 12:06 pm
by alys666
короче из тела треда ты можешь использовать любую тредсэйв функцию как родную. но функция должна быть таковой обьявлена в доках или комментах к ней.
функция что не обращается к глобальным обьектам, или внешним устройствам напрямую, то есть к ресурсам - тредсейф. например сложить два числа и вернуть сумму.
если функция обращается к глобальному обьекту - например какому нибудь списку, набору данных и проч - она не тредсейф и такие обьекты можно пользовать только под защитой мьютексов или крит секций. тред залочивает мьютекс и если другой тред пытается его тоже залочить - он встает в очередь ожидания разлочивания. как только первый тред мьютекс разлочит, тот что стоит в очереди получит управление, залочит мьютекс на себя, и не пустит другие треды. таким образом достигается монопольная работа с общим обьектом.
но есть и атомарные операции процессора, например в интеле атомарной оперцией процессора является любая операция с адресом(переменной) при размере до 32 или 64 байт(зависит от модели памяти).
то есть если таким общим ресурсом явлется просто int, его мьютексом не нужно защищать, если операции простые, например присваивание и чтение.
но если операция типа ++i; это не атомарная оперция. сначала идет чтение в регистр, потом прибавление 1 потом запись в память. вот если между чтением и записью будет переключение тредов, и другой тред сделает то же самое, возникнет путаница, и вместо увеличения на 2, будет увеличение на 1.

Re: cutecode, Ну и где вопрос про треды?

Posted: Mon Jan 06, 2020 3:42 pm
by cutecode
Привет, еще раз.

Я тут разбираюсь пока. Пока думал как вопросы сформулироватаь, ты на них уже ответил.
Спасибо, я так и решил что надо пользоваться mutex-ами, вот только не понятно какие функции thread-safe, а какие - нет.
Пока узнаю все это методом "тыка", через дебаг определяю где прога крэшится и ставлю wxCriticalSection.

Пока вот что надыбал

1. для каждого потока надо вызывать srand, иначе всегда одни и те же rand() выходят
2. wxConfig - not thread-safe, при обращении к реестру прога крэшится
3. wxCSConv - то же not thread-safe. Функции этого класса почему то обращаются к wxConfig

Есть ли еще описание списка не безопасных функций для wxWidgets?

Re: cutecode, Ну и где вопрос про треды?

Posted: Mon Jan 06, 2020 3:56 pm
by alys666
да они там все падать будут, кроме совсем невинных.
там большинство можно только из главного треда вызывать.
да и не надо на вторичных тредах делать серьезную функциональность. их роль вспомогательна - помочь головному треду в его задачах.

нет списка безопасных. считай что опасные все, если явно не указано что безопасна.

про srand - ерунда какая-то. там общий код будет для всех тредов. если сам rand безопасный, то просто будешь выбирать рандомы друг за другом разными тредами. никакой srand ничего не улучшит. если хочешь чтобы рандомы были из разных последовательностей надо свой класс Random написать и использовать в каждом треде свой экземпляр его

Re: cutecode, Ну и где вопрос про треды?

Posted: Mon Jan 06, 2020 4:36 pm
by cutecode
у меня soap server через gSoap, его только многопоточным делать надо, иначе тормоза будут.

rand - он безопасный, просто если не вызвать srand, то потом у каждого потока одинаковые rand() идут. Если вызывать srand() в каждом потоке, тогда rand() разные в каждом потоке.

Re: cutecode, Ну и где вопрос про треды?

Posted: Mon Jan 06, 2020 10:14 pm
by alys666
про rand ерунда какая-то.
в базовой реализации он опасный, и его мьютексом надо защищать.
другое дело что без мьютекса там ничего не упадет, просто будут взаимовлияние на генерируемую последовательность от тредов.
по хорошему надо инициализировать генератор через srand случайным числом в самом начале программы, еще до запуска тредов, написать обертку для rand с мьютексом, и брать rand через нее.
обычный rand не может быть изначально безопасным, там есть глобальное внутреннее состояние. другое дело, что опасно там только в смысле не вполне корректной псевдослучайной последовательности, а не падения программы.
вызывать srand в разных тредах бессмысленно, актуален будет только последний srand.