Аннотация:
STL и многие другие библиотеки написаны с учётом эффективности и удобства, но без учёта многопоточности процессов ( и это правильно ), но как же использовать эту кучу кода в многопоточных приложениях без написания эквивалентной кучи кода Чтобы решить эту проблему, я написал простой класс (заголовочный файл "mthread.h")
GuardedT<"класс, доступ к объекту которого должен быть синхронизирован",
"класс блокировки">
позволяющий использовать немногопоточные типы в многопоточной среде:
с STL всё же возможны траблы -- например если в одном потоке делаетсе итерирование по всем элементам std::list, а в другом какой-нить элемент удаляется...
то есть такой пример потенциально может вызвать проблеммы:
typedef std::list< std::string > sl;
GuardT< sl > some_list;
void thread1()
{
for( sl::iterator it = some_list->begin();
it != some_list->end();
++it )
{
// ...
}
}
void thread2()
{
while( ( sl::iterator it = some_list->begin() ) != some_list->end() )
some_list->erase( it );
}
А всё почему? Потому что итераторы возвращаются незащищённые. То есть существует вероятность что:
1) thread1 сделает sl::iterator it = some_list->begin();
2) произойдёт threadswitching
3) thread2 сделает первую итерацию цикла -- удалит первый элемент
4) когда очередь дойдёт до thread1 it будет указывать в никуда...
Что касается блокировки различных потоков ( данных ), то здесь можно ( и нужно :)
оптимизировать вывод, возвращая не заблокированный cout, а, например, ostringstream или
что-то на него похожее, деструктор которого записывает сформатированную строку в cout
( читай — блокировка только на вывод одной сформатированной строки )
поскольку форматирование различных данных занимает время, а блокировать другие потоки
( вычислительные ) на всё время форматирования — не хорошо. Таким образом, мы и
мультипоточной среде можем ничего не терять... кроме волос на голове, но и здесь мы в плюсе,
поскольку говорят, что волосы уже научились пересаживать с какой-то задней части :)
всё тот же писатель ( ударение ставьте сами :)
Re: Многопоточность с немногопоточными типами? Это просто !
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
Re[2]: Многопоточность с немногопоточными типами? Это просто
В искустве летать есть один маленький секрет. Секрет этот в том,чтобы бросить себя изо всех сил на землю — и не попасть. Выберете погожий денек и попробуйте сами.
Re: Многопоточность с немногопоточными типами? Это просто !
Сорри что поднимаю "зомби", но возник следующий вопрос.
Дело в том, что приведенное решение, в общем случае, не является корректным С++ кодом (и компиляция на comeau это подтверждает), поскольку недоступен конструктор копирования для объекта, передаваемого по значению.
Понятно, хотелось бы аналогичного, но работоспособного на современных компиляторах решения. Может кто видел?