?

Log in

No account? Create an account

Previous Entry Share Next Entry
ThreadString - потокозависимые строки - это офигенно.
mikelsv
Непонятно, почему эта идея не пришла ко мне лет десять назад. Ну хотябы пять. Ведь ThreadString это поистине офигенная штука.

Что это такое? Это строки привязанные к конкретному потоку. То есть для каждого потока создается свой буфер в котором они и хранятся. Но не долго, это исключительно временные переменные. Но, если раньше приходилось выделять память под каждую строку через malloc, то теперь есть один буфер на все строки, что резко ускоряет работу с выделением памяти. Из минусов: изменение строки в большую сторону требует выделения нового блока памяти в буфере. Это конечно тяжело, но вполне себе можно навыделять такими темпами парочку гигов.

Теперь хочется вспомнить и остальной арсенал. В котором первым номером конечно идет class VString{ public: unsigned char * data; unsigned int sz; } - указатель на строки. Давно заменивший собой char *; Класс позволяет менять свои переменные, что позволяет делать разные офигенные вещи, но к сожалению не спасает от криворукости, типа выхода за границу памяти или использования указателя на уже удаленную строку.

Используете char* для хранения строк? Убейтесь. В нем нельзя хранить строки. Ну, то есть можно, но осторожно и с параноей во все поля. Код, который можно обрушить входящими данными должен умереть.

Дальше идет class MString : public VString; Та же ерунда, только при MString str = "111"; класс выделяет память под строку.
Теперь появился TString : public VString; Хранящий строку в буфере привязанном к потоку. И все локальные MString, недоступные из других потоков дружно идут меняться на TString.

Существует множество ситуаций, где нужен временный буфер на мгновение. Для этого есть класс ITos, по умолчанию занимающий 128 байт на стеке плюс переменная MString для хранения больших обьемов. Что не всегда удобно. Теперь эту задачу можно свалить на TString.

В процессе использования напишу функции для TString, аналогичные MString. Так же, очевидно, придется решить вопросы совсестимости трех классов VString, MString и TString. И по ощущениям очень не хватает, и обязательно сделаю, возможность переключиться на новый буфер, чтобы новые TString писались в него, а при выходе из функции будет возвращаться старый буфер.

И пара технических моментов:
При создании TString создается буфер для потока, если его еще нет. А так же увеличивается счетчик  __declspec(thread) int tstring_core_count; В деструкторе счетчик уменьшается. Если счетчик равен нулю буфер очищается. Поэтому важно писать код так, чтобы все переменные уничтожались, иначе класс сожрет всю доступную память, пусть и не сразу. Так же может быть косяк при частом создании / удалении потоков. Полагаю ввести опцию удаления буфера, а не очищения, когда он больше не нужен.

А еще TString очень здорово расшифровывается как TmpString, что так же отражает его суть.
Да здраствует TString и светлое будущее!
Tags: