Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема с памятью... / 25 сообщений из 59, страница 1 из 3
03.02.2016, 12:30
    #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
03.02.2016, 15:51
    #39162133
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с памятью...
kir86975,

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

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

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

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

я так понимаю менеджер памяти банально не знает что работает в мультипоточке?
...
Рейтинг: 0 / 0
05.02.2016, 15:16
    #39164061
kir86975
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с памятью...
Siemargl, Возможно проблема действительно в /MT. Сейчас проверю.
...
Рейтинг: 0 / 0
05.02.2016, 15:17
    #39164063
kir86975
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с памятью...
Dima T, _beginthreadex это ж просто вроде как обертка? Или какие-то преимущества дает?
...
Рейтинг: 0 / 0
05.02.2016, 15:18
    #39164064
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с памятью...
kir86975Dima T, _beginthreadex это ж просто вроде как обертка? Или какие-то преимущества дает?
инициализирует рантайм С/С++ для данного потока.
...
Рейтинг: 0 / 0
05.02.2016, 15:19
    #39164066
kir86975
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с памятью...
Dima T, StackWalker работать не должен, его просто можно закомментировать
...
Рейтинг: 0 / 0
05.02.2016, 15:22
    #39164075
kir86975
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с памятью...
Dima T, CreateThread примерно ведь то же самое и делает, только поток сразу запускает на выполнение. Или просто в C++ вырвиглазно смотрится? Мне просто нужно использовать обязательно стандарт C++98. Но че-то я _beginthreadex в нем не нашел.
...
Рейтинг: 0 / 0
05.02.2016, 15:26
    #39164080
kir86975
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с памятью...
Siemargl, Переполнение памяти из-за очереди тоже возможно. Но у меня как правило валилось еще до No_memory. Т.е. что-то типа использование уже освобожденной памяти...
...
Рейтинг: 0 / 0
05.02.2016, 15:28
    #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
05.02.2016, 15:29
    #39164087
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проблема с памятью...
kir86975Dima T, CreateThread примерно ведь то же самое и делает, только поток сразу запускает на выполнение. Или просто в C++ вырвиглазно смотрится? Мне просто нужно использовать обязательно стандарт C++98. Но че-то я _beginthreadex в нем не нашел.
CreateThread() в стандарте тоже нет. Стандарт C++98 вообще не имеет стандартных методов создания потока.
CreateThread() не инициализирует CRT. 8017066
Не уверен что тебе нужна эта инициализация, но хуже точно не будет.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Проблема с памятью... / 25 сообщений из 59, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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