powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема с памятью...
25 сообщений из 59, страница 1 из 3
Проблема с памятью...
    #39161846
kir86975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема с памятью...

Очень нужна помощь!
Есть два потока, которые вместе "бьют" память:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
DWORD WINAPI mainThreadFunction(LPVOID lpParam){
	MainThread* mainThread = (MainThread*)lpParam;
	while(!mainThread->terminated)
	{
		mainThread->readQueue();
		Sleep(100);
	}

	return 0;
}

DWORD WINAPI slaveThreadFunction(LPVOID lpParam){
	SlaveThread* slaveThread = (SlaveThread*)lpParam;
	while(!slaveThread->terminated)
	{
		slaveThread->writeToQueue();
		Sleep(100);
	}

	return 0;
}

MainThread::MainThread()
{
	this->threadFunction = mainThreadFunction;
	this->functionArguments = this;
	this->mainQueue = new MessageQueue();
	this->CommonThread::startThread();
}

void MainThread::readQueue()
{
	size_t size;
	mainQueue->getSize(&size);
	while(size != 0)
	{
		CommonMessage* message = NULL;
		mainQueue->popMessage(&message);
		mainQueue->getSize(&size);
		delete message;
	}
}

SlaveThread::SlaveThread(MessageQueue* mainQueue)
{
	this->threadFunction = slaveThreadFunction;
	this->functionArguments = this;
	this->mainQueue = mainQueue;
	this->CommonThread::startThread();
}

void SlaveThread::writeToQueue()
{
	mainQueue->pushMessage(new CommonMessage(new LaunchReadingMessage(false)));
}



Такой код без потоков работает идеально:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
	MessageQueue* myQ = new MessageQueue();
	while(true)
	{
		CommonMessage* message = new CommonMessage(new LaunchReadingMessage(false));
		myQ->pushMessage(message);
		message = NULL;
		myQ->popMessage(&message);
		delete message;
		//Sleep(100);
	}


Синхронизация в очереди есть:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
#include "stdafx.h"
#include "MessageQueue.h"

MessageQueue::MessageQueue()
{
	messageQueue = new queue<CommonMessage*>;
	InitializeCriticalSection(&criticalSection);
}

void MessageQueue::pushMessage(CommonMessage* message)
{
	EnterCriticalSection(&criticalSection);
	messageQueue->push(message);
	LeaveCriticalSection(&criticalSection);
}

CommonMessage* MessageQueue::popMessage(CommonMessage** message)
{
	EnterCriticalSection(&criticalSection);
	*message = messageQueue->front();
	messageQueue->pop();
	LeaveCriticalSection(&criticalSection);
	return *message;
}

size_t MessageQueue::getSize(size_t* size)
{
	EnterCriticalSection(&criticalSection);
	*size = messageQueue->size();
	LeaveCriticalSection(&criticalSection);
	return *size;
}

MessageQueue::~MessageQueue()
{
	while (messageQueue->size() != 0)
	{
		CommonMessage* tempMessage = NULL;
		tempMessage = popMessage(&tempMessage);
		delete tempMessage;
	}

	delete messageQueue;
	DeleteCriticalSection(&criticalSection);
}



Пожалуйста, объясните почему с потоками ничего не выходит..
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39162133
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kir86975,

Так сложно сказать, по коду вроде бы всё ок, если я не пропустил чего.
Если расстреливается память, то можно поставить в отладчике прерывание по записи в этот участок памяти
и таким образом отловить, где эта запись происходит.
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39162173
kir86975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
По моему я пробовал. Но еще раз попробую и отпишусь.
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39162395
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На три раза просмотрел - нет тут проблем. Возможно они в той части кода, которая отсутствует. Вынеси этот код в отдельный проект, добавь проверки и добейся повтора проблемы.
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39162401
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
heisenbug
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39163044
kir86975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а может быть такое что проблема в компиляторе? Я делал это в VS2003. Давал другому человеку - он у себя запускал в VS2010, как я понял и сказал, что ошибок вообще никаких нет, что все отлично работает
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39163050
kir86975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, это и так уже у меня отдельный проект, для проверки как раз добавления и извлечения из очереди )
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39163184
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kir86975а может быть такое что проблема в компиляторе? Я делал это в VS2003. Давал другому человеку - он у себя запускал в VS2010, как я понял и сказал, что ошибок вообще никаких нет, что все отлично работает

Ты оптимизацию выключаешь, когда собираешь ?
Если нет, добейся, чтобы всё это не работало в релизной версии с отключенной оптимизацией и с собранной debug info.
Тогда можно будет отлаживаться.
А ещё лучше -- в дебажной версии.
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39163188
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kir86975Dima T, это и так уже у меня отдельный проект, для проверки как раз добавления и извлечения из очереди )

Так давай весь код сюда, может кто-то и посмотрит.
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39163766
kir86975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39163768
kir86975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Еще кое-что забыл сказать. У меня VS2003 установлен на WinXP, которая в свою очередь на виртуалке. Может быть проблема в виртуалке?
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39163803
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kir86975Может быть проблема в виртуалке?
нет
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39163831
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У тебя простой пример просили, а там какой-то Stackwalker который не компилируется. MSVC 2015
Выкинул его, скомпилировалось, на консоли пусто, висит, что-то делает. Косяк как проявляется?
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39163845
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kir86975,

для тестирования нужно побольше погонять, но главное - ты забыл указать, что компилировать с многопоточной CRT (/MT)
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39163856
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CreateThread() замени на _beginthreadex()
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39163956
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем все работает, только замечательно переполняется очередь (и ес-но память) и тогда уже вылетает.
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39163976
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima T,

я так понимаю менеджер памяти банально не знает что работает в мультипоточке?
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39164061
kir86975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemargl, Возможно проблема действительно в /MT. Сейчас проверю.
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39164063
kir86975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, _beginthreadex это ж просто вроде как обертка? Или какие-то преимущества дает?
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39164064
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kir86975Dima T, _beginthreadex это ж просто вроде как обертка? Или какие-то преимущества дает?
инициализирует рантайм С/С++ для данного потока.
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39164066
kir86975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, StackWalker работать не должен, его просто можно закомментировать
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39164075
kir86975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dima T, CreateThread примерно ведь то же самое и делает, только поток сразу запускает на выполнение. Или просто в C++ вырвиглазно смотрится? Мне просто нужно использовать обязательно стандарт C++98. Но че-то я _beginthreadex в нем не нашел.
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39164080
kir86975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Siemargl, Переполнение памяти из-за очереди тоже возможно. Но у меня как правило валилось еще до No_memory. Т.е. что-то типа использование уже освобожденной памяти...
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39164084
kir86975
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот пример ошибки через некоторое время работы:
Heap corruption detected at 00330860
HEAP[TestQueue.exe]: HEAP: Free Heap block 330858 modified at 330868 after it was freed
Unhandled exception at 0x7c90120e in TestQueue.exe: User breakpoint.
...
Рейтинг: 0 / 0
Проблема с памятью...
    #39164087
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kir86975Dima T, CreateThread примерно ведь то же самое и делает, только поток сразу запускает на выполнение. Или просто в C++ вырвиглазно смотрится? Мне просто нужно использовать обязательно стандарт C++98. Но че-то я _beginthreadex в нем не нашел.
CreateThread() в стандарте тоже нет. Стандарт C++98 вообще не имеет стандартных методов создания потока.
CreateThread() не инициализирует CRT. 8017066
Не уверен что тебе нужна эта инициализация, но хуже точно не будет.
...
Рейтинг: 0 / 0
25 сообщений из 59, страница 1 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема с памятью...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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