Добавлен , опубликован
Программирование
Язык:
C++
Недавно на работе пришлось столкнуться с изменением старого кода, который был написан еще на C++. Вчера я сделал небольшой фикс, зачикинил код ну и ушел. А вот сегодня пришел на работу только к вечеру, а там паника, все сломалось и ничего не работает (плюсовые странички зависают). Оказалось проблема в моем изменении. Меня уже даже поругали немного :c
// Track numbers of readers
	IncrementReaderCount();
	
	CCustomer *pCustomer = NULL;
	if (!m_Customers.Lookup(CustomerID, pCustomer)) {
		LoadCacheNeedReload(CustomerID, NULL);
		m_Customers.Lookup(CustomerID, pCustomer);
	}

	DecrementReaderCount();
Код нелепо простой, но как оказалось в этом и была причина. Забавно было слышать возможные предположения из-за чего все крашилось.
Функция LoadCachedNeedReload должна принимать вторым параметром тип LONG, а ты ему NULL суешь
Мда.... ну ладно не будем обижаться на них, они все равно знают намного больше чем я, но слышать это было странно, ведь
NULL это тот же 0, только NULL
// Для справки
#define NULL 0
Ну ладно, я пошел дальше разбираться в чем же косяк. Обнаружил, что в методе загрузки кеша стоит бесконечное ожидание всех риадеров. Я наверное с пол часа не мог въехать в чем косяк. В результате я заметил почему:
  • Мы увеличиваем кол-во риадеров
  • Пытаемся прочитать, если не получилось
  • Обновляем кэш, во время чтения которого мы ждем завершения всех риадеров (ждем когда установиться кол-во риадеров в 0)
  • Еще раз пытаемся прочитать
  • Уменьшаем кол-во риадеров
Заметили косяк? Забавно, не правда ли? Пытаемся дождаться выполнения инструкции, которая должна произойти после бесконечного ожидания :D
В итоге пришлось немного переписать этот кусок кода на такой вот варинат
// Track numbers of readers
	IncrementReaderCount();
	
	CCustomer *pCustomer = NULL;
	if (!m_Customers.Lookup(CustomerID, pCustomer)) {
		DecrementReaderCount();

		LoadCacheNeedReload(CustomerID, 0);

		IncrementReaderCount();
		m_Customers.Lookup(CustomerID, pCustomer);
	}

	DecrementReaderCount();
Вот такие вот мертвые петли бывают, когда работаешь с синхронизацией потоков.
`
ОЖИДАНИЕ РЕКЛАМЫ...