> Повторю совет начать использовать valgrind чем раньше, тем лучше, размер стека задаётся
> при помощи pthread_attr_setstacksize(), а мутексы можно сделать размером с int. Точнее,
> не классические мутексы, а с небольшим бузи-вейтом - volatile int
> + атомарные бьюлтины gcc (compare_exchange и подобные) +
> sched_yield(). За совет с валгридом отдельное спасибо еще раз. Уже поставил новую ОС и валгрид, правда, если я правильно понул суть, то пока для своих целей использовать не получится: нужно переписать приложение, чтобы при завершении освобождало всю память (чтобы увидеть утечки)
Буду читать документацию.
> Складывается впечатление, что у вас слишком большое количество мутексов.
Два мутекса на объект-сессию для "человека". В принципе, можно до одного сократить, врятли один человек будет создавать одновременные запросы к демону.
По проблеме памяти и мутексов, ошибка, видимо в реализации мутексов под FreeBSD 6.1 или при компиляции gcc. потому что после перехода на FreeBSD 8.2 тот же код и база стартует занимая не 250 мегабайт, а 50мб (учитывая что часть этой памяти - это сами потоки). Хотя все равно мутекс не равен int*2(rw mutex), но уже приемлемо.
Да, к слову, может кому-то будет интересно, у меня по результатам получилось на FreeBSD 6.1, что мутексы не инициализированные занимают не много
pthread_rwlock_t aMutex;
но как только инициализируешь каждый pthread_rwlock_init(&aMutex, NULL); - сразу память сжирается.
а константный инициализатор вообще не работает:
pthread_rwlock_t rwlock1 = PTHREAD_RWLOCK_INITIALIZER;