Я продолжаю развивать свой проект, который работает с большим количеством потоков. Тем не менее, у него есть одна очень большая проблема — утечки памяти.
Я «лесенки«отобрать некоторые фрагменты кода и упростить их, поэтому довольно легко понять, что он делает. Код написан на C ++, это консольное приложение, так что этот код должен нормально работать в любой студии. Вот:
#include <afxwin.h>
#include <map>
#include <list>
#include <vld.h>
using namespace std;
int t = 1;
static map<const int, pair<void *, int>> Buffer;
list<int> ret;
void func(int * y)
{
while (t)
{
if (!Buffer[*y].first)
{
ret.push_back(*y);
Buffer[*y].first = y;
};
}
return;
}
UINT Object_Thread(LPVOID pParam)
{
func((int *) pParam);
return 0;
};
void main()
{
long i = 150;
int * p1 = new int (1);
int * p2 = new int (2);
Buffer[1].first = NULL;
Buffer[2].first = NULL;
AfxBeginThread(Object_Thread,p1);
AfxBeginThread(Object_Thread,p2);
while (i-->0)
{
if (Buffer[1].first)
{
ret.push_back(0);
Buffer[1].first = NULL;
}
if (Buffer[2].first)
{
ret.push_back(0);
Buffer[2].first = NULL;
}
}
t = 0; i = 100000;
while (i-->0)
{}
delete p1, p2;
return;
};
В конце концов, где main()
должен вернуть контроль в систему, я поставил while()
Дает нитям достаточно времени, чтобы закончить. Задача состоит в том, чтобы «ret» содержал числа из функции main () и 2 функций func (), а цифры «0» должны следовать за «1» или «2» или за ними обоими, а затем за «1» или » 2 «должны были появиться снова, и вот как система должна работать.
Это своего рода переключатель, который позволяет вам ввести какое-то значение в буфер, а затем другой поток должен получить его и освободить буфер для следующих данных. Но во время испытаний Я получил что-то вроде 1 2 0 0 0 0 0 2 0 0 0 0 0 2 0 0 …, Итак, 0 встречается много раз, но, из-за концепции, это должно быть максимум 2 «нуля» подряд.
Что не так с моим кодом?
Задача ещё не решена.