C ++中线程的内存分配

时间:2014-01-22 11:16:28

标签: c++ multithreading winapi

如何在C ++中为内存显式分配内存?我使用Windows API进行多线程。虽然有时运行它正确执行但有时它显示“堆腐败”,“未处理的异常”。请指导我

这是我创建线程的main()。

int main(int argc,char *argv[])
    {
        HANDLE hthread[MAX_THREADS];
        //DWORD threadid;
        FILETIME creation,exit,kernel,user;
        SYSTEMTIME st1,st2;
        //THREADENTRY32 entry;
        char szEntrytime[255],szExittime[255];

        directories.push_front(argv[1]);
        files.clear();
        Sem = CreateSemaphore(NULL,MAX_SEM_COUNT,MAX_SEM_COUNT,NULL);
        if (Sem == NULL) 
        {
            printf("CreateSemaphore error: %d\n", GetLastError());
            return 1;
        }

        for(int i= 0;i<MAX_THREADS;i++)
        {
            hthread[i] = CreateThread(NULL,0,List,NULL,0,&threadid);
            //hthread[i] = HeapAlloc(GetProcessHeap(),HEAP_NO_SERIALIZE,1024*30);
             if( hthread[i] == NULL )
            {
                printf("CreateThread error: %d\n", GetLastError());
                return 1;
            }
        }

内线程

while(!directories.empty())
    {
        string path = directories.front();
        string spec = path + "\\" + "*";
        WaitForSingleObject(Sem,0L);
        directories.pop_front();
        ReleaseSemaphore(Sem,1,NULL);

        HANDLE hfind = FindFirstFileA(spec.c_str(),&ffd);
        if(hfind == INVALID_HANDLE_VALUE)
            continue;
        cout<< path <<endl;;
        do
        {
            if(strcmp(ffd.cFileName,".") && strcmp(ffd.cFileName,".."))
            {
                if(ffd.dwFileAttributes &FILE_ATTRIBUTE_DIRECTORY)
                {
                    WaitForSingleObject(Sem,0L);
                    directories.push_front(path + "\\" + ffd.cFileName);
                    ReleaseSemaphore(Sem,1,NULL);
                }
                else
                {
                    files.push_back(path + "\\" + ffd.cFileName);
                    Files++;
                }
            }
        }while(FindNextFileA(hfind,&ffd));

2 个答案:

答案 0 :(得分:0)

对访问共享资源使用关键部分:
EnterCriticalSection(&my_section);
//perform data manipulation per-thread
LeaveCriticalSection(&my_section);

在使用之前不要忘记初始化关键部分。
请参阅此问题以获取帮助Problems using EnterCriticalSection

答案 1 :(得分:0)

为您的线程使用以下逻辑(伪代码):

while ( true ) {

    lock()
    if ( empty ) {
       unlock;
       sleep;
       continue;
    } else {
       get_one_dir;
       remove_that_dir_from_list;
       unlock;
    }
    process_the_dir;
    continue;
}

对于锁定,如果要在列表中推送新目录,请使用Critical Section再次锁定/解锁

在读取/写入文件向量时使用相同的锁定/解锁逻辑。