Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Валятся методы STL в многопоточном приложении. / 24 сообщений из 24, страница 1 из 1
20.09.2007, 09:52:21
    #34813307
selinoth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
Кто-нибудь сталкивался такой с проблемой: есть минимум два потока, в каждом из них открыт свой std::ofstream и производится запись. В некоторый момент времени из глубин STL поднимается segmentation fault... Иногда это происходит при работе с basic_string и map. Я использую visual c++ 6.0
Помогите, плз!
...
Рейтинг: 0 / 0
20.09.2007, 10:02:09
    #34813342
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
Объекты stl не потокозащищенные.
...
Рейтинг: 0 / 0
20.09.2007, 10:11:04
    #34813383
selinoth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
Это я уже понял... а что делать-то? Может быть, есть какое-то вполне себе решение?
...
Рейтинг: 0 / 0
20.09.2007, 10:16:58
    #34813413
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
selinothЭто я уже понял... а что делать-то? Может быть, есть какое-то вполне себе решение?

Можно, например, защитить объекты атомаными флагами (мьютексками, критическими секциями).
...
Рейтинг: 0 / 0
20.09.2007, 11:09:12
    #34813633
selinoth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
AkhМожно, например, защитить объекты атомаными флагами (мьютексками, критическими секциями).
Мьютексы я использую на удалении/добавлении в контейнеры и т.п. Но, блин, если вешать мьютекс на каждую запись в файл, то эффективность многопоточности в моем проекте отпадает. У меня такое есть предположение, что проблема в выделении памяти при работе со строками. Стоит ли сделать свой thread-safe аллокатор, перекрывать new / delete ?

Подскажите, есть ли на свете thread-safe опробованная библиотека для работы с контейнерами под linux и windows с STL-like вызовами?
...
Рейтинг: 0 / 0
20.09.2007, 11:19:25
    #34813681
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
[quot selinothНо, блин, если вешать мьютекс на каждую запись в файл, то эффективность многопоточности в моем проекте отпадает.[/quot]

Что за беда ? Используй критические секции
...
Рейтинг: 0 / 0
20.09.2007, 11:20:41
    #34813688
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
Приведи конкретную ситуацию
...
Рейтинг: 0 / 0
20.09.2007, 11:24:09
    #34813705
Sandro_K
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
selinoth
Мьютексы я использую на удалении/добавлении в контейнеры и т.п. Но, блин, если вешать мьютекс на каждую запись в файл, то эффективность многопоточности в моем проекте отпадает. У меня такое есть предположение, что проблема в выделении памяти при работе со строками. Стоит ли сделать свой thread-safe аллокатор, перекрывать new / delete ?

Подскажите, есть ли на свете thread-safe опробованная библиотека для работы с контейнерами под linux и windows с STL-like вызовами?

Что-то мне не совсем понятно, ты пишешь из 2-х потоков в 1 открытый файл, или в 2 разных файла?
Если пытаешься писать в один файл, не синхронизируя потоки, то непонятно что ты хочешь получить в этом файле. Если в разные файлы, то для каждого из них существует свой объект, и никакой проблемы с синхронизацией быть не должно.
...
Рейтинг: 0 / 0
20.09.2007, 11:26:50
    #34813719
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
Защищать контейнер общего назначения дорого и неблагодарно, гораздо проще защитить прикладной объект, посторенный на основе контейнера STL
...
Рейтинг: 0 / 0
20.09.2007, 11:59:16
    #34813876
selinoth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
Sandro_KЧто-то мне не совсем понятно, ты пишешь из 2-х потоков в 1 открытый файл, или в 2 разных файла?
Если пытаешься писать в один файл, не синхронизируя потоки, то непонятно что ты хочешь получить в этом файле. Если в разные файлы, то для каждого из них существует свой объект, и никакой проблемы с синхронизацией быть не должно.
В два разных и проблема есть. Только что попробовал скомпилить на BCC32 - проблемы нет, а на m$ CL есть! от этого ацки грустно.
...
Рейтинг: 0 / 0
20.09.2007, 12:02:28
    #34813895
selinoth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
blindedЗащищать контейнер общего назначения дорого и неблагодарно, гораздо проще защитить прикладной объект, посторенный на основе контейнера STL
Короче так, я сделал интерфейс для добавления/удаления различных объектов. Реализовал алгоритм так, чтобы он общался через этот интерфейс с хранилищем данных. На каждый метод реализации интерфейса навесил мьютексную лочку. В каждом потоке пишется свой собственный файл, выделяется память, указатели на новые объекты отдаются интерфесу (для сохранения и обработки). Валится то на записи, то на конструкторах новых объектов. Скомпилил на борландятине - проблемы нет.
...
Рейтинг: 0 / 0
20.09.2007, 12:11:00
    #34813943
selinoth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
Вот на что похож стэк фрейм при падении:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
NTDLL! 7c901230()
NTDLL! 7c949eb9()
NTDLL! 7c96d6aa()
NTDLL! 7c949d18()
NTDLL! 7c91b298()
_heap_alloc_base(unsigned int 80) line 200
_heap_alloc_dbg(unsigned int 36, int 1, const char * 0x00000000, int 0) line...
_nh_malloc_dbg(unsigned int 36, int 1, int 1, const char * 0x00000000, int 0...
_nh_malloc(unsigned int 36, int 1) line 197 + 19 bytes
operator new(unsigned int 36) line 24 + 11 bytes
std::_Allocate(int 36, char * 0x00000000) line 30 + 9 bytes
std::allocator<nx::ITypedValue *>::_Charalloc(unsigned int 36) line 62 + 11...
std::_Tree<std::basic_string<char,std::char_traits<char>,std::allocator<char...
std::_Tree<std::basic_string<char,std::char_traits<char>,std::allocator<char...
std::_Tree<std::basic_string<char,std::char_traits<char>,std::allocator<char...
std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char>...
nx::StateBase::StateBase() line 9 + 114 bytes
nx::State::State(nx::IState * 0x00994390, nx::IBranch * 0x00323df0, const un...
nx::Traveller::Process() line 170 + 88 bytes
nx::Thread::Run() line 180 + 13 bytes
nx::ThreadAdapter::Run(void * 0x00514040) line 16 + 13 bytes
nx::ThreadProc(void * 0x00514040) line 23 + 9 bytes
KERNEL32! 7c80b683()

здесь nx::State - конструктор нового класса.
...
Рейтинг: 0 / 0
20.09.2007, 12:41:13
    #34814068
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
Интересно, а почему ты сделал вывод что виноват STL, может ты сам развалил таблицу размещения?
...
Рейтинг: 0 / 0
20.09.2007, 12:48:22
    #34814094
Intser
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
selinoth blindedЗащищать контейнер общего назначения дорого и неблагодарно, гораздо проще защитить прикладной объект, посторенный на основе контейнера STL
Короче так, я сделал интерфейс для добавления/удаления различных объектов. Реализовал алгоритм так, чтобы он общался через этот интерфейс с хранилищем данных. На каждый метод реализации интерфейса навесил мьютексную лочку. В каждом потоке пишется свой собственный файл, выделяется память, указатели на новые объекты отдаются интерфесу (для сохранения и обработки). Валится то на записи, то на конструкторах новых объектов. Скомпилил на борландятине - проблемы нет.

Мало что понятно из такого описания. Если на каждый метод интерфейса делать по мутексу - тупик вероятен :).
Стл-кие строки нормально создаются в разных потоках - вообще тут скорее всего дело не в стл, а в том как ты его используешь.
...
Рейтинг: 0 / 0
20.09.2007, 14:01:00
    #34814454
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
selinoth пишет:
> Кто-нибудь сталкивался такой с проблемой: есть минимум два потока, в
> каждом из них открыт свой std::ofstream и производится запись. В
> некоторый момент времени из глубин STL поднимается segmentation fault...

Вы использовали multi-threaded C Run Time Library ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
20.09.2007, 14:38:46
    #34814671
selinoth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
IntserМало что понятно из такого описания. Если на каждый метод интерфейса делать по мутексу - тупик вероятен :). Стл-кие строки нормально создаются в разных потоках - вообще тут скорее всего дело не в стл, а в том как ты его используешь.
Мутех один на все методы. Я не делаю ничего криминального:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
	if (!m_out. is_open())
	{
		char buffer[ 10 ] = { 0 };
		itoa( GetHandle(), buffer,  10  );
		m_out. open( (string_t( buffer ) + ".log"). c_str() );
		local_assert( m_out. is_open() );
	}
	state -> GetSpan( position, length );
	m_out << std::setfill('_') << std::setw( 79 ) << "_" << std::setfill(' ') << std::endl;
	m_out	<< state
			<< std::setw(  8  ) << ((position + length)/ 8  +  1 )
			<< ": " << state -> GetNode() -> GetName()
			<< std::endl;
метод GetName() возвращает string_t, который есть
Код: plaintext
1.
2.
3.
4.
	typedef std::basic_string <
		symbol_t,
		std::char_traits <symbol_t>,
		std::allocator <symbol_t> > string_t;
...
Рейтинг: 0 / 0
20.09.2007, 14:40:09
    #34814675
selinoth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
blindedИнтересно, а почему ты сделал вывод что виноват STL, может ты сам развалил таблицу размещения?
1. Обвал всегда в объектах STL
2. С одним потоком все прекрасно пашет
...
Рейтинг: 0 / 0
20.09.2007, 14:43:35
    #34814694
selinoth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
MasterZiv
Вы использовали multi-threaded C Run Time Library ?

Опаньки... я первый раз слышу, что в M$ Visual C++ 6.0 можно выбирать тип run time library. Можно подробнее, как это сделать?
...
Рейтинг: 0 / 0
20.09.2007, 14:52:03
    #34814718
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
selinoth blindedИнтересно, а почему ты сделал вывод что виноват STL, может ты сам развалил таблицу размещения?
1. Обвал всегда в объектах STL
2. С одним потоком все прекрасно пашет
Почти уговорил.Могут быть проблемы со стрингом, есть там гадости и сильные различия в реализациях.
Но пока ничего не понятно. Код ты привел один, стэк совершеноо от другого куска...
...
Рейтинг: 0 / 0
20.09.2007, 15:11:08
    #34814800
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
selinoth пишет:

> Вы использовали multi-threaded C Run Time Library ?
> Опаньки... я первый раз слышу, что в M$ Visual C++ 6.0 можно выбирать

В настройках проекта.

С/С++ / Code generation / Runtime Library.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.09.2007, 09:24:59
    #34816565
selinoth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
Пашет! Спасибо всем!
...
Рейтинг: 0 / 0
21.09.2007, 10:02:59
    #34816683
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
selinoth пишет:

> Пашет! Спасибо всем!

Так что было -то ? Поделись, не таи в себе ...
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
21.09.2007, 12:35:01
    #34817350
selinoth
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
MasterZivТак что было -то ? Поделись, не таи в себе ...
Я думаю, что проблема с записью в поток и выделением памяти была именно в singlethreaded runtime library. По кр. мере если я сейчас переключаюсь на неё, то падения периодически происходят. Сделал класс мьютекс с Lock / Unlock и счетчиком, убрал прямые вызовы апишных функций, добавил семафор на случай отсутствия данных. Сейчас стабильно работает 12 часов.
Короче, получилось как в анекдоте "пап, почему утром солнце встает а вечером садится... проверял? работает? тогда не трогай ради бога..."
Займусь сравнением кода, если найду причину, то опишу здесь.
...
Рейтинг: 0 / 0
21.09.2007, 13:07:42
    #34817512
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Валятся методы STL в многопоточном приложении.
selinothКороче, получилось как в анекдоте "пап, почему утром солнце встает а вечером садится... проверял? работает? тогда не трогай ради бога..."


Нееа, это как в ДРУГОМ анекдоте:
"Ой, а чо эта она зажужжала ???"
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Валятся методы STL в многопоточном приложении. / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]