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

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

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

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

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

Что-то мне не совсем понятно, ты пишешь из 2-х потоков в 1 открытый файл, или в 2 разных файла?
Если пытаешься писать в один файл, не синхронизируя потоки, то непонятно что ты хочешь получить в этом файле. Если в разные файлы, то для каждого из них существует свой объект, и никакой проблемы с синхронизацией быть не должно.
...
Рейтинг: 0 / 0
Валятся методы STL в многопоточном приложении.
    #34813719
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Защищать контейнер общего назначения дорого и неблагодарно, гораздо проще защитить прикладной объект, посторенный на основе контейнера STL
...
Рейтинг: 0 / 0
Валятся методы STL в многопоточном приложении.
    #34813876
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandro_KЧто-то мне не совсем понятно, ты пишешь из 2-х потоков в 1 открытый файл, или в 2 разных файла?
Если пытаешься писать в один файл, не синхронизируя потоки, то непонятно что ты хочешь получить в этом файле. Если в разные файлы, то для каждого из них существует свой объект, и никакой проблемы с синхронизацией быть не должно.
В два разных и проблема есть. Только что попробовал скомпилить на BCC32 - проблемы нет, а на m$ CL есть! от этого ацки грустно.
...
Рейтинг: 0 / 0
Валятся методы STL в многопоточном приложении.
    #34813895
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedЗащищать контейнер общего назначения дорого и неблагодарно, гораздо проще защитить прикладной объект, посторенный на основе контейнера STL
Короче так, я сделал интерфейс для добавления/удаления различных объектов. Реализовал алгоритм так, чтобы он общался через этот интерфейс с хранилищем данных. На каждый метод реализации интерфейса навесил мьютексную лочку. В каждом потоке пишется свой собственный файл, выделяется память, указатели на новые объекты отдаются интерфесу (для сохранения и обработки). Валится то на записи, то на конструкторах новых объектов. Скомпилил на борландятине - проблемы нет.
...
Рейтинг: 0 / 0
Валятся методы STL в многопоточном приложении.
    #34813943
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот на что похож стэк фрейм при падении:
Код: 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
Валятся методы STL в многопоточном приложении.
    #34814068
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Интересно, а почему ты сделал вывод что виноват STL, может ты сам развалил таблицу размещения?
...
Рейтинг: 0 / 0
Валятся методы STL в многопоточном приложении.
    #34814094
Intser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selinoth blindedЗащищать контейнер общего назначения дорого и неблагодарно, гораздо проще защитить прикладной объект, посторенный на основе контейнера STL
Короче так, я сделал интерфейс для добавления/удаления различных объектов. Реализовал алгоритм так, чтобы он общался через этот интерфейс с хранилищем данных. На каждый метод реализации интерфейса навесил мьютексную лочку. В каждом потоке пишется свой собственный файл, выделяется память, указатели на новые объекты отдаются интерфесу (для сохранения и обработки). Валится то на записи, то на конструкторах новых объектов. Скомпилил на борландятине - проблемы нет.

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

Вы использовали multi-threaded C Run Time Library ?
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Валятся методы STL в многопоточном приложении.
    #34814671
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Валятся методы STL в многопоточном приложении.
    #34814675
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blindedИнтересно, а почему ты сделал вывод что виноват STL, может ты сам развалил таблицу размещения?
1. Обвал всегда в объектах STL
2. С одним потоком все прекрасно пашет
...
Рейтинг: 0 / 0
Валятся методы STL в многопоточном приложении.
    #34814694
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Вы использовали multi-threaded C Run Time Library ?

Опаньки... я первый раз слышу, что в M$ Visual C++ 6.0 можно выбирать тип run time library. Можно подробнее, как это сделать?
...
Рейтинг: 0 / 0
Валятся методы STL в многопоточном приложении.
    #34814718
Фотография blinded
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selinoth blindedИнтересно, а почему ты сделал вывод что виноват STL, может ты сам развалил таблицу размещения?
1. Обвал всегда в объектах STL
2. С одним потоком все прекрасно пашет
Почти уговорил.Могут быть проблемы со стрингом, есть там гадости и сильные различия в реализациях.
Но пока ничего не понятно. Код ты привел один, стэк совершеноо от другого куска...
...
Рейтинг: 0 / 0
Валятся методы STL в многопоточном приложении.
    #34814800
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Валятся методы STL в многопоточном приложении.
    #34816565
Фотография selinoth
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пашет! Спасибо всем!
...
Рейтинг: 0 / 0
Валятся методы STL в многопоточном приложении.
    #34816683
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
selinoth пишет:

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

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


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


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