Безопасность потоков - это не то, что вы должны добавить к своим переменным, это то, что вы должны добавить к своей «логике».Если вы добавите блокировки ко всем своим переменным, ваш код не обязательно будет потокобезопасным, но он будет чертовски медленным.Чтобы написать поточно-ориентированную программу, посмотрите на свой код и решите, где несколько потоков могут использовать одни и те же данные / объекты.Добавьте блокировки или другие меры безопасности ко всем этим критическим местам.
Например, если предположить следующий бит псевдокода:
void updateAvgBuyPrice()
{
float oldPrice = AvgBuyPrice;
float newPrice = oldPrice + <Some other logic here>
//Some more new price calculation here
AvgBuyPrice = newPrice;
}
Если этот код вызывается из нескольких потоков одновременноВаша логика блокировки не имеет смысла.Представьте себе поток A, получающий AvgBuyPrice и выполняющий некоторые вычисления.Теперь, прежде чем это будет сделано, поток B также получает AvgBuyPrice и начинает вычисления.Тем временем поток A завершен и назначит новое значение AvgBuyPrice.Однако через несколько секунд он будет перезаписан потоком B (который все еще использовал старое значение), и работа потока A. будет полностью потеряна.
Так как же это исправить?Если бы мы использовали блокировки (что было бы самым уродливым и самым медленным решением, но самым простым, если вы только начинаете с многопоточности), нам нужно поместить всю логику, которая изменяет AvgBuyPrice, в блокировки:
void updateAvgBuyPrice()
{
lock(AvgBuyPriceLocker)
{
float oldPrice = AvgBuyPrice;
float newPrice = oldPrice + <Some other code here>
//Some more new price calculation here
AvgBuyPrice = newPrice;
}
}
Теперь, если поток B хочет выполнить вычисления, пока поток A все еще занят, он будет ждать, пока поток A не будет завершен, и затем выполнит свою работу, используя новое значение.Имейте в виду, однако, что любой другой код, который также изменяет AvgBuyPrice, должен также блокировать AvgBuyPriceLocker, пока он работает!
Тем не менее, это будет медленным, если его часто использовать.Блокировки дороги, и есть много других механизмов, чтобы избежать блокировок, просто ищите алгоритмы без блокировки.