purebasic.info

PureBasic forum
Текущее время: Вт мар 19, 2019 9:18 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 134 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9  След.
Автор Сообщение
 Заголовок сообщения: Re: Многопоточность - вопросы
СообщениеДобавлено: Вс ноя 29, 2015 5:23 am 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
Читать - не писать. Проблем не будет, я думаю.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Паралельные потоки
СообщениеДобавлено: Вс ноя 29, 2015 1:45 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11423
Благодарил (а): 4 раз.
Поблагодарили: 453 раз.
Berck писал(а):
Могут ли начинаться проблемы, если в потоках только читать глобальные переменные, массивы, списки и т.д., не блокируя мьютексом?
Проблемы могут быть, особенно со списками. Если допустим один поток изменил текущий элемент, а за ним второй поток также изменит текущий элемент, то первый прочитает не то что нужно.

Berck писал(а):
3. Что происходит, если в то самое мгновение когда мы читаем (без блоков мьютексом) в потоке данные из переменной или области памяти, эти данные обновляются в основной программе?
Это как повезет. Если повезет, все будет нормально, а если нет, программа завершится с ошибкой. Ошибка все равно произойдет, это лишь вопрос времени.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Многопоточность - вопросы
СообщениеДобавлено: Вс ноя 29, 2015 4:29 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Berck писал(а):
1. Могут ли начинаться проблемы, если в потоках только читать глобальные переменные, массивы, списки и т.д., не блокируя мьютексом?
...
2. Вопрос, подобный первому, но про чтение в потоке без лока мьютексом из выделенной (командой AllocateMemory) области памяти.
начнутся 100%... основная из них - одновременный доступ более одного потока к одним и тем же данным - вылет программы
при чём во время запуска из PB могут и не возникнуть (при запуске с отладчиком), сам по этому по началу думал что можно без мьютексов работать с потоками обращающимися к одним данным, но облАмался :oops:


Berck писал(а):
3. Что происходит, если в то самое мгновение когда мы читаем (без блоков мьютексом) в потоке данные из переменной или области памяти, эти данные обновляются в основной программе?
аналогичная ситуация, считай свою "основную программу" ещё одни потоком, который будет конкурировать за эти данные, и рано или поздно (зависит от кода программы) в общие данные сунутся более одного потока ...
Не считай мьютексы проблемой, ствишь лок перед данными и унлок после - получается любой поток обращающийся к ним будет проходит через эти лок и унлок, соверещенно без проблем работается с мьютексами...


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Паралельные потоки
СообщениеДобавлено: Вс ноя 29, 2015 9:18 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
registrymechanic писал(а):
начнутся 100%... основная из них - одновременный доступ более одного потока к одним и тем же данным - вылет программы
при чём во время запуска из PB могут и не возникнуть (при запуске с отладчиком), сам по этому по началу думал что можно без мьютексов работать с потоками обращающимися к одним данным, но облАмался

Можно пример?
У меня в одной программе количество потоков плавает от 100 до 5000. Есть глобальная переменная со значением 0, все потоки постоянно мониторят эту переменную и, если она меняется на какое-то другое значение, то потоки завершают работу. Программа писалась несколько лет назад, но до сих пор не было таких ошибок, о которых ты говоришь.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Многопоточность - вопросы
СообщениеДобавлено: Вс ноя 29, 2015 10:35 pm 
Не в сети
ассистент

Зарегистрирован: Пт май 15, 2015 5:16 am
Сообщений: 23
Благодарил (а): 11 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
registrymechanic писал(а):
сам по этому по началу думал что можно без мьютексов работать с потоками обращающимися к одним данным, но облАмался :oops:

А точно было только чтение?
registrymechanic писал(а):
Не считай мьютексы проблемой, ствишь лок перед данными и унлок после - получается любой поток обращающийся к ним будет проходит через эти лок и унлок, соверещенно без проблем работается с мьютексами...

Мьютексы я проблемой не считаю - просто для чего ставить ненужные при чтении? Чтобы программу притормозить?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Паралельные потоки
СообщениеДобавлено: Вс ноя 29, 2015 10:37 pm 
Не в сети
ассистент

Зарегистрирован: Пт май 15, 2015 5:16 am
Сообщений: 23
Благодарил (а): 11 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Berck писал(а):
Могут ли начинаться проблемы, если в потоках только читать глобальные переменные, массивы, списки и т.д., не блокируя мьютексом?
Проблемы могут быть, особенно со списками. Если допустим один поток изменил текущий элемент, а за ним второй поток также изменит текущий элемент, то первый прочитает не то что нужно.
Пётр, вопрос был только про чтение потоками


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Паралельные потоки
СообщениеДобавлено: Вс ноя 29, 2015 10:40 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11423
Благодарил (а): 4 раз.
Поблагодарили: 453 раз.
Я ответил в первую очередь про списки. Не имеет значение, будут читаться или записываться данные в список. К нему в один и тот же момент должен иметь доступ только один поток.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Паралельные потоки
СообщениеДобавлено: Вс ноя 29, 2015 10:43 pm 
Не в сети
ассистент

Зарегистрирован: Пт май 15, 2015 5:16 am
Сообщений: 23
Благодарил (а): 11 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Berck писал(а):
3. Что происходит, если в то самое мгновение когда мы читаем (без блоков мьютексом) в потоке данные из переменной или области памяти, эти данные обновляются в основной программе?
Это как повезет. Если повезет, все будет нормально, а если нет, программа завершится с ошибкой. Ошибка все равно произойдет, это лишь вопрос времени.
Т.е. если я правильно понимаю, то по аналогии 10000 потоков открывают файл только на чтение и вдруг в этом файле основная прога сделала изменения - какой-то поток всё равно поймает глюк при чтении файла и это лишь вопрос времени? Т.е. на команду ReadFile(...) тоже лучше вешать мьютекс?


Последний раз редактировалось Berck Вс ноя 29, 2015 10:49 pm, всего редактировалось 1 раз.

Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Паралельные потоки
СообщениеДобавлено: Вс ноя 29, 2015 10:45 pm 
Не в сети
ассистент

Зарегистрирован: Пт май 15, 2015 5:16 am
Сообщений: 23
Благодарил (а): 11 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Я ответил в первую очередь про списки. Не имеет значение, будут читаться или записываться данные в список. К нему в один и тот же момент должен иметь доступ только один поток.
Прошу прощения, это из личного опыта или есть в какой-то документации?


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Паралельные потоки
СообщениеДобавлено: Вс ноя 29, 2015 11:20 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11423
Благодарил (а): 4 раз.
Поблагодарили: 453 раз.
Пример глюков при доступе к списку без использования мьютекса.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Global NewList TestList.l()
 
Procedure Thread(Number)
  Repeat
    SelectElement(TestList(), Number-1)
    Delay(Random(400)+200)
    Debug "Поток №"+Str(Number)+" данные "+Str(TestList())
  ForEver
EndProcedure
 
For i=1 To 4
  AddElement(TestList())
  TestList() = i
Next
 
For i=1 To 4
  CreateThread(@Thread(), i)
Next
 
MessageRequester("", "Нажниме 'OK' для закрытия программы")

Номер потока (элемента списка) и данные должны совпадать. Если не совпадают это глюк. Подробнее тут. viewtopic.php?p=30560#p30560

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Многопоточность - вопросы
СообщениеДобавлено: Пн ноя 30, 2015 7:12 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 18, 2009 3:41 am
Сообщений: 1126
Благодарил (а): 86 раз.
Поблагодарили: 11 раз.
Пункты репутации: 0
Berck писал(а):
А точно было только чтение?
на сколько помню было не "только чтения", скорее всего было ещё и изменение данных.

Berck писал(а):
ReadFile(...)
ты используешь чтение данных из файла и бьёшься за миллисекунды которые возьмут на себя мьютексы? :) (кстати, вот именно при работе с данными из файла, я не уверен что нужны какие-либо мьютексы, ну в частности при работе с командой ReadFile(), она вроде для этого и задумывалась... ну естественно с оговорками ,что сопутствующий ReadFile() код - причёсан и не вызовет ошибок)
если в файл пишет твоя же программа и она с него же считывает, может есть возможность сделать какой-нибудь "буфер" в памяти (ну т.е. то что пишешь в файл - дублировать в этот буфер) с которым ты и будешь работать в программе? Ведь "10000" потоков с обращениями к HDD - уже не комильфо :shock:

MrF писал(а):
...Есть глобальная переменная со значением...
именно тот код уже не вспомню... только для себя давно заимел правило, потоки надо рулить (мьютексами, иногда по надобности добавляю семафоры), возможно просто глобальная переменная, без постоянного её изменения, отрабатывает без проблем, расклада подробного не дам - я не силен в этих "логарифмических изречениях" :wink: - сужу только на собственном, печальном, опыте. В потоках в основном работаю с "NewList", может по этому у меня сложилась такое отношение к работе с потоками, но пока такой метод не подводил.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Многопоточность - вопросы
СообщениеДобавлено: Вт дек 01, 2015 12:49 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Berck писал(а):
Мьютексы я проблемой не считаю - просто для чего ставить ненужные при чтении? Чтобы программу притормозить?

Вообще то такой подход называют ковнокодом. Вы еще попробуйте открытые хендлы и ненужную выделенную память не закрывать, возможно программа полетит :)
PS Ничего личного, все имхо

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Паралельные потоки
СообщениеДобавлено: Вт дек 01, 2015 1:34 am 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
registrymechanic писал(а):
возможно просто глобальная переменная, без постоянного её изменения, отрабатывает без проблем

Вот я о том же. С обычными переменными проблем не должно быть, даже если в главном потоке переменная будет меняться.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Многопоточность - вопросы
СообщениеДобавлено: Вт дек 01, 2015 5:04 am 
Не в сети
ассистент

Зарегистрирован: Пт май 15, 2015 5:16 am
Сообщений: 23
Благодарил (а): 11 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
pablov писал(а):
Berck писал(а):
Мьютексы я проблемой не считаю - просто для чего ставить ненужные при чтении? Чтобы программу притормозить?

Вообще то такой подход называют ковнокодом. Вы еще попробуйте открытые хендлы и ненужную выделенную память не закрывать, возможно программа полетит :)
PS Ничего личного, все имхо

Если не трудно, то объясните пожалуйста, что такое "открытые хендлы"?
А под ненужной выделенной памятью подразумевается память, выделенная в основной программе, к которой обращаемся чтением в потоке? Я как раз об этом изначально вопрос задавал. Или это память, выделенная в основной программе, но к которой в потоках не обращаются даже на чтение? Просто если выделенная память уже действительно ненужна, то я обычно ей делаю FreeMemory.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: Паралельные потоки
СообщениеДобавлено: Вт дек 01, 2015 5:58 pm 
Не в сети
профессор

Зарегистрирован: Вс июн 10, 2012 8:18 am
Сообщений: 1294
Благодарил (а): 60 раз.
Поблагодарили: 49 раз.
Пункты репутации: 14
Berck писал(а):
А под ненужной выделенной памятью подразумевается память, выделенная в основной программе, к которой обращаемся чтением в потоке?

Выделяем память для какой-то операции, когда процедура отработала с этой памятью, то память надо освободить, иначе чревато утечкой памяти.


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 134 ]  На страницу Пред.  1 ... 4, 5, 6, 7, 8, 9  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: Google [Bot] и гости: 5


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB