|
Синхронизация потоков
|
|||
---|---|---|---|
#18+
Добрый день! У меня есть SerialPort. Я подписался на его событие DataReceived Код: c# 1. 2. 3. 4. 5. 6.
Как говорит MSDN при каждом срабатывании DataReceived создаётся отдельный поток (ошибаюсь?). Что у меня происходит в DataReceived: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
Как видите у меня используется одна переменная FInput. Проблема: - Вошёл в метод SetInput, иду по коду в режиме отладки; - Стою на строке 1; - В строке 1 не происходит ничего серьёзного - просто запись в лог; - Смотрю что в переменной FInput - данные есть; - Выполняю строку кода 1 и перехожу на строку 2 (номера условны само собой); - Смотрю что в переменной FInput - данных нет! Я так понял что они "съедаются" другим потоком (а метод SetInput может при опр. обстоятельствах скушать данные в FInput), который заработал за спиной моего текущего потока. И дейтсвительно! обратил внимание н апотоки и увидел что пападаю в SetInput в разных потоках параллельно. Вопрос: Посоветуйте, пожалуйста, как правильно синхронизировать такие потоки? Я их не порождаю ведь! Какие методы/приёмы синхронизации надо применить в данном случае? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 14:41 |
|
Синхронизация потоков
|
|||
---|---|---|---|
#18+
Алексей Ку., Прошу прозения. надо уточнить следующее: В методе SetInput происходит вызов метода Find() Код: c# 1.
куда яи передаю по ссылке FInput. именно метод Find и может обрезать строку. Именно в метод Find я попаадаю из разных потоков и именно внутри него происходит история, когда переходишь на след строку, а в переменно уже пустота! ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 14:45 |
|
Синхронизация потоков
|
|||
---|---|---|---|
#18+
дело в том, что хоть string И является классом но, при конкатенации строк, в памяти создается новый объект, куда копируется левый и правый операнд. то есть вы передаете указатель на объект в памяти, а потом создаете уже новый объект с другим адресом в котором объединяете старую часть и новую :). думаю проблема именно в этом. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 15:22 |
|
Синхронизация потоков
|
|||
---|---|---|---|
#18+
Roman Mejtes, Т.е. проблема не в том что, данные стираются в другом потоке, а в том что указатель, который я передал начинает указывать на пустую строку? Как можно это проанализировать? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 15:29 |
|
Синхронизация потоков
|
|||
---|---|---|---|
#18+
Я убрал лишний код в методе SetInput(а именно те части, которые могли обрезать строку). Теперь он такой: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
Стою в режиме отладки на строке DoLog. Перехожу на след и у меня уже пустая строка! ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 15:34 |
|
Синхронизация потоков
|
|||
---|---|---|---|
#18+
Я бы использовал byte[] в качестве хранилища входного буфера, который должен дополняться в процессе и который нужно анализировать. Со строками будут большие проблемы ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 15:37 |
|
Синхронизация потоков
|
|||
---|---|---|---|
#18+
Алексей Ку.Roman Mejtes, Т.е. проблема не в том что, данные стираются в другом потоке, а в том что указатель, который я передал начинает указывать на пустую строку? Как можно это проанализировать? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 15:44 |
|
Синхронизация потоков
|
|||
---|---|---|---|
#18+
Отбой! Проблема найдена. Кое-где в анналах кода была строка которая делала FInput = ""; Проблема обнаружена - чудес не бывает. Видимо грешить на та что сбивается указатель - неверно. Хотя всё равно было интересно про это узнать. Сейчас всё равно поиграю с указателями. Вопрос теперь другой возник: Если я делаю в начале метода lock(FInput) - почему он не срабатывает и позволяет из другого потока сделать FInput = ""? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 16:04 |
|
Синхронизация потоков
|
|||
---|---|---|---|
#18+
Алексей Ку.Если я делаю в начале метода lock(FInput) - почему он не срабатывает и позволяет из другого потока сделать FInput = ""? Если FInput - строка, то после всяких конкатенаций и Finput="" рассчитывать на то, что в разных потоках lock(FInput) сработает, не стоит. Для лока обычно создают отдельный объект синхронизации Код: c# 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 16:30 |
|
Синхронизация потоков
|
|||
---|---|---|---|
#18+
Pallaris, Получается, что lock не гарантирует что другая часть кода не получит доступа к объекту синхронизации, а гарантирует то, что одна часть кода, в которой используется lock, не будет выполнена в один момент времени? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 16:36 |
|
Синхронизация потоков
|
|||
---|---|---|---|
#18+
Алексей Ку.Получается, что lock не гарантирует что другая часть кода не получит доступа к объекту синхронизации Гарантирует, если в другой части кода тоже стоит lock на тот же самый объект. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 17:41 |
|
Синхронизация потоков
|
|||
---|---|---|---|
#18+
Фишка в том, что после каждого нового присваивания твой string FInput будет ссылаться на новый объект в памяти, и поэтому использовать его для лока нельзя ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 17:43 |
|
Синхронизация потоков
|
|||
---|---|---|---|
#18+
Pallaris, О как... Спасибо! Буду дальше изучать тонкости поведения кода! Спасибо всем за ответы/советы! ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 17:46 |
|
Синхронизация потоков
|
|||
---|---|---|---|
#18+
Алексей Ку., просто создайте flag любую переменную и делайте lock на неё вот и всё ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2015, 18:04 |
|
Синхронизация потоков
|
|||
---|---|---|---|
#18+
Алексей Ку., Рассмотрите еще вот эту штуку ReaderWriterLockSlim Может помочь улучшить производительность, чем стандартный lock, если специфика данной задачи это позволит (ОТНОСИТЕЛЬНО редко запись, и часто часто часто чтение несколькими потоками сразу). ... |
|||
:
Нравится:
Не нравится:
|
|||
21.05.2015, 12:41 |
|
|
start [/forum/topic.php?fid=20&msg=38964398&tid=1401527]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
29ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
1ms |
others: | 339ms |
total: | 454ms |
0 / 0 |