Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.11.2014, 15:56   #1
lavilin
 
Регистрация: 23.11.2014
Сообщений: 4
По умолчанию Потокобезопасность

Добрый день!

В описании ко многим классам на msdn написано
Цитата:
Любые открытые члены этого типа, объявленные как static (Shared в Visual Basic), являются потокобезопасными. Потокобезопасность членов экземпляров не гарантируется.
Я создал объект класса SerialPort, создал несколько потоков и каждый поток отправляет что-то по компорту:

Код:
private void TestSend(string s)
{
    serialport.WriteLine(s);
}
В результате получается что-то вроде


Цитата:
Сообщение от потока №1
Сообщение от потока №1
Сообщение от потока №1
Сообщение от потока №1
Сообщение от потока №1
Сообщение от потока №2
Сообщение от потока №2
Сообщение от потока №2
Сообщение от потока №2
Сообщение от потока №2
Сообщение от потока №1
Сообщение от потока №1
Сообщение от потока №1
Сообщение от потока №1
Сообщение от потока №3
Сообщение от потока №3
Сообщение от потока №3

и так далее
Запускал неоднократно, создавал разное число потоков, но строчки всегда отправлялись полностью, то есть не было случая, когда один поток отправит только пол строки, а потом прерывается и другой поток отправляет свою строку:

Цитата:
Сообщение от потСообщение от потока №2

Получается метод WriteLine класса SerialPort потокобезопасный, если одновременно несколько потоков не могу ничего писать в компорт?
Как тогда понимать фразу "Потокобезопасность членов экземпляров не гарантируется"?
Такая же фраза присутствует и в описании свойства BaseStream объекста SerialPort.
lavilin вне форума Ответить с цитированием
Старый 23.11.2014, 17:36   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Как тогда понимать фразу "Потокобезопасность членов экземпляров не гарантируется"?
Видимо имеется ввиду поля класса, которые не статические.
А вообще нужно читать источник твоей цитаты.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 23.11.2014, 18:17   #3
lavilin
 
Регистрация: 23.11.2014
Сообщений: 4
По умолчанию

Например, вот:
http://msdn.microsoft.com/ru-ru/libr...v=vs.110).aspx

WriteLine() - это же тоже член экземпляра? То есть метод этот не потокобезопасный, а значит при его выполнении одновременно в нескольких потоках он может прерываться, но почему-то на практике такое не происходит
lavilin вне форума Ответить с цитированием
Старый 23.11.2014, 22:20   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Сообщение от lavilin Посмотреть сообщение
Например, вот:
http://msdn.microsoft.com/ru-ru/libr...v=vs.110).aspx

WriteLine() - это же тоже член экземпляра? То есть метод этот не потокобезопасный, а значит при его выполнении одновременно в нескольких потоках он может прерываться, но почему-то на практике такое не происходит
не гарантируется это не значит что обязательно будет фейл.
это лишь значит что они могут быть.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.11.2014, 00:16   #5
lavilin
 
Регистрация: 23.11.2014
Сообщений: 4
По умолчанию

Так в этом и вопрос - почему фейлов нет?

Например:
Код:
        static void Print(object color)
        {
            ConsoleColor c = (ConsoleColor)color;
            string s = Thread.CurrentThread.Name;
            for (int i = 0; i < 100; i++)
            {
         //       lock (locker)
                {
                    Console.ForegroundColor = c;
                    Console.WriteLine("{0}", s);
                }
            }
            Console.WriteLine("{0} закончил работу", s);
    }
Если вызвать этот метод из нескольких потоков, то практически всегда цвета напечатонного текста сбиваются потому что после строчки

Код:
            Console.ForegroundColor = c;
второй поток вытесняет первый и начинает печатать свой текст, но не тем цветом которым задумывалось.

Почему такого не происходит с методом WriteLine() объекта SerialPort? Он же должен быть потоконебезопасным. Сколько не создавал потоков, сбоев не было.
lavilin вне форума Ответить с цитированием
Старый 24.11.2014, 01:10   #6
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Он же должен быть потоконебезопасным.
кто сказал что должен быть?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 24.11.2014, 09:30   #7
lavilin
 
Регистрация: 23.11.2014
Сообщений: 4
По умолчанию

Полагаю в описании на msdn было бы что-нибудь сказно в таком случае... Как тогда узнать какие методы потокобезопасны, а какие нет? В каких случаях нужно применять синхронизацию потоков, а в каких она уже встроена?
lavilin вне форума Ответить с цитированием
Старый 24.11.2014, 10:17   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от lavilin Посмотреть сообщение
Полагаю в описании на msdn было бы что-нибудь сказно в таком случае... Как тогда узнать какие методы потокобезопасны, а какие нет? В каких случаях нужно применять синхронизацию потоков, а в каких она уже встроена?
Если написано, что потокобезопасный, то не нужно дополнительно синхронизировать, а если тишина, то лучше не надеяться на везение или текущую типа правильную работу. Не забывайте, что ошибки в многопоточном ПО, долго и не увлекательно искать.
У меня так в студенчестве по TCP одним куском данные кидались, я дополнительные проверки и докачивания не стал прописывать. В универе только посыпались косяки, когда сервер и комп на разные компы разнесли.
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц