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

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
alys666
Super wx Problem Solver
Super wx Problem Solver
Posts: 317
Joined: Tue Oct 18, 2016 2:31 pm

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

Post by alys666 » Mon Jan 06, 2020 12:06 pm

короче из тела треда ты можешь использовать любую тредсэйв функцию как родную. но функция должна быть таковой обьявлена в доках или комментах к ней.
функция что не обращается к глобальным обьектам, или внешним устройствам напрямую, то есть к ресурсам - тредсейф. например сложить два числа и вернуть сумму.
если функция обращается к глобальному обьекту - например какому нибудь списку, набору данных и проч - она не тредсейф и такие обьекты можно пользовать только под защитой мьютексов или крит секций. тред залочивает мьютекс и если другой тред пытается его тоже залочить - он встает в очередь ожидания разлочивания. как только первый тред мьютекс разлочит, тот что стоит в очереди получит управление, залочит мьютекс на себя, и не пустит другие треды. таким образом достигается монопольная работа с общим обьектом.
но есть и атомарные операции процессора, например в интеле атомарной оперцией процессора является любая операция с адресом(переменной) при размере до 32 или 64 байт(зависит от модели памяти).
то есть если таким общим ресурсом явлется просто int, его мьютексом не нужно защищать, если операции простые, например присваивание и чтение.
но если операция типа ++i; это не атомарная оперция. сначала идет чтение в регистр, потом прибавление 1 потом запись в память. вот если между чтением и записью будет переключение тредов, и другой тред сделает то же самое, возникнет путаница, и вместо увеличения на 2, будет увеличение на 1.
ubuntu 16.04, wxWidgets 3.0.4

User avatar
cutecode
Super wx Problem Solver
Super wx Problem Solver
Posts: 307
Joined: Fri Dec 09, 2016 7:28 am
Contact:

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

Post by cutecode » Mon Jan 06, 2020 3:42 pm

Привет, еще раз.

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

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

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

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

regards,
Alexander Saprykin
https://v2.dental-soft.ru

alys666
Super wx Problem Solver
Super wx Problem Solver
Posts: 317
Joined: Tue Oct 18, 2016 2:31 pm

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

Post by alys666 » Mon Jan 06, 2020 3:56 pm

да они там все падать будут, кроме совсем невинных.
там большинство можно только из главного треда вызывать.
да и не надо на вторичных тредах делать серьезную функциональность. их роль вспомогательна - помочь головному треду в его задачах.

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

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

User avatar
cutecode
Super wx Problem Solver
Super wx Problem Solver
Posts: 307
Joined: Fri Dec 09, 2016 7:28 am
Contact:

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

Post by cutecode » Mon Jan 06, 2020 4:36 pm

у меня soap server через gSoap, его только многопоточным делать надо, иначе тормоза будут.

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

regards,
Alexander Saprykin
https://v2.dental-soft.ru

alys666
Super wx Problem Solver
Super wx Problem Solver
Posts: 317
Joined: Tue Oct 18, 2016 2:31 pm

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

Post by alys666 » Mon Jan 06, 2020 10:14 pm

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

Post Reply