C 中线程的内存分配

Memory Allocation for threads in C++

本文关键字:内存 分配 线程      更新时间:2023-10-16

如何将内存分配给C 中的线程?我正在使用Windows API进行多线程。有时运行它正确执行,但有时会显示"堆损坏","未手动异常"。请指导我

这是我创建线程的主要()。

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: %dn", 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: %dn", 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));

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

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

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

阅读/编写文件向量时,请使用相同的锁/解锁逻辑。

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

不要忘记在使用之前初始化关键部分。
请参阅此问题以使用enterclitalSection

获得帮助问题