繁体   English   中英

C ++中线程的内存分配

[英]Memory Allocation for threads in C++

如何在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));

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

使用前,请不要忘记初始化关键部分。
请参阅此问题以获取帮助使用EnterCriticalSection时遇到的问题

对线程使用以下逻辑(伪代码):

while ( true ) {

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM