线程同步

时间:2014-08-11 10:17:29

标签: c++ thread-synchronization

我一直在开发我的项目,它适用于很多线程。它还有一个非常大的问题 - 内存泄漏。

我“撕掉”远离其代码的一些片段并简化它们,因此,很容易理解它的作用。代码是在 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 个答案:

没有答案