LINUX.ORG.RU

синглтон падает при вызоде из main

 , ,


0

3

Всем привет, имеется такой синглтон

class CSocketController {
	std::vector<int> SocketsLst;
	CSocketController() = default;


	std::mutex mtx;
public:

	CSocketController(const CSocketController&) = delete;
	CSocketController(CSocketController&&) = delete;
	CSocketController& operator=(const CSocketController&) = delete;
	CSocketController& operator=(CSocketController&&) = delete;

	static CSocketController& instance()
	{
		static CSocketController inst;
		return inst;
	}

	void AddSocket(int fd)
	{
		std::unique_lock<std::mutex>(mtx);
		SocketsLst.push_back(fd);
	}


	virtual ~CSocketController() = default;
};

И есть приложение которое запускает практически одновременно ок 100 тредов, каждый из которых юзает функцию AddSocket.

В итоге приложение при выходе крашется в самом конце, main полностью отработал. По дампу вычислил, что краш происходит на

virtual ~CSocketController() = default;

Крайне редко краш случается и при вызове функции AddSocket в одном и тредов, точнее на локе мьютекса, но это редко.

Погуглил немного, использование локальных статических переменных в разных тредах валидно. То есть инициализация не может быть частичной или разной у разных тредов. Никак не могу понять в чем дело.

Судя по дампу проблема в алокаторах в vector

Это я что-то делаю не так? Или это баг стандартной либы?

★★★★★

Или это баг стандартной либы?

ты сделал мой день! :)

anonymous
()
Ответ на: комментарий от eao197

Да, объекты юзающие потоки хранятся в векторе, вектор очищен уже даже до return 0, в деструкторах join как надо. Правда я мог конечно где-то затупить и какие-то потоки остались висеть. Проверю еще, но там маловероятно.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

Взаимно исключающие высказывания:

Проверю еще, но там маловероятно.

Крайне редко краш случается и при вызове функции AddSocket в одном и тредов, точнее на локе мьютекса, но это редко.

eao197 ★★★★★
()
Ответ на: комментарий от eao197

Да и насколько я помню статические переменные удаляются после main. А у меня в программе ни одного new нет. А значит все объекты (кроме статических) к моменту выхода из main уничтожены и завершены.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от tailgunner

Твою же, да тут ошибка. Чертова невнимательность=) Спасибо.

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от Dudraug

Судя по всему tailgunner выше уже указал причину. Вероятно, хотели написать так:

std::unique_lock<std::mutex> _(mtx)

Но ошиблись, в результате push_back идет без всякой защиты, отсюда и порча памяти вектора.

eao197 ★★★★★
()
Ответ на: комментарий от tailgunner

Скорее всего в этом ошибка и есть, вектор поломался и при его уничтожение случается потом краш=)

Dudraug ★★★★★
() автор топика
Ответ на: комментарий от eao197

Угу, оно и есть. Всем спасибо. Проблема решилась как и многие другие проблемы через ревью другим человеком.

Dudraug ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.