Синхронизация потоков

Я продолжаю развивать свой проект, который работает с большим количеством потоков. Тем не менее, у него есть одна очень большая проблема — утечки памяти.

Я «лесенки«отобрать некоторые фрагменты кода и упростить их, поэтому довольно легко понять, что он делает. Код написан на 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 «нуля» подряд.

Что не так с моим кодом?

0

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]