Цитата(kosyak© @ Feb 26 2012, 10:00)

Т.е. если вызывать эту процедуру из разных потоков, то они будут ждать разблокировки всего списка, хотя эта процедура не изменяет сам список и эта блокировка вроде как излишня...но в то же время Процедура очистки списка обязана блокировать весь список на время своей работы..т.е. пиходится блокировать спсиок всегда...
Если не хотите блокировать весь список - нужно внимательно смотреть, чтобы между операциями "берём элемент" (то бишь получаем указатель на него), "блокируем его", "уменьшаем счётчик", "разблокируем его" не могло вклиниться удаление элемента из соседнего потока, в противном случае взятый указатель уже будет недействительным и произойдет exception. Чтобы этого не произошло - элемент нужно блокировать ДО получения на него указателя, и соседний поток тоже должен блокировать элемент ДО его удаления. Это неразрешимая ситуация, мютекс блокировки обычно находится внутри самого элемента, и чтобы его блокировать, нужно уже знать указатель ... Вынесение мютекса в статический массив тоже ничего не решит - всё равно внутри элемента нужно будет хранить индекс мютекса в массиве и т. д.
Поэтому, по всей видимости, без блокировки всего списка не обойтись.