• Windows 下多线程编程技术



    (1) 线程的创建:(主要以下2)

    CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,
      LPVOID lParam,
      int nPriority = THREAD_PRIORITY_NORMAL,
      UINT nStackSize = 0,
      DWORD dwCreateFlags = 0,
      LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL
      );

    HANDLE CreateThread(
      LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD
      SIZE_T dwStackSize, // initial stack size
      LPTHREAD_START_ROUTINE lpStartAddress, // thread function
      LPVOID lpParameter, // thread argument
      DWORD dwCreationFlags, // creation option
      LPDWORD lpThreadId // thread identifier
      );

    DWORD WINAPI myroutine(LPVOID param)

    {

           printf("%d,hello from subroutine! ",*((int*)param));

           return NULL;

    }

    int _tmain(int argc, _TCHAR* argv[])

    {

           printf("hello from main! ");

           int iSub = 11;

           DWORD dId;

           HANDLE hThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)myroutine,(LPVOID)&iSub,0,&dId);

           return 0;

    }

    (2) 结束线程:

    BOOL CloseHandle(HANDLE hObject);

    BOOLTerminateThread( HANDLEhThread,DWORDdwExitCode);

    VOID ExitThread(DWORD dwExitCode);

    结束线程最好使用线程函数返回,TerminateThreadExitThread2种方式都不推荐使用,也尽量不用。

    ( 3 ) 线程的暂停/重启:

    DWORD SuspendThread( HANDLE hThread );

    DWORD ResumeThread( HANDLE hThread );

    ( 4 ) 线程优先级:

    BOOL SetThreadPriority( HANDLE hThread, int nPriority ); 从主线程继承基础上设置优先级。

    ( 5 ) 公共资源的并发访问与同步:

    临界区:

    Critical_Section cs;

    void main()

    {

           InitializeCriticalSection(&cs);

           …

           DeleteCriticalSection(&cs);

    }

    DWORD WINAPI mythread(LPVOID param)

    {

    EnterCriticalSection(&cs);       ¬

    …//操作。。。

    LeaveCriticalSection(&cs);

    }

    锁机制:

    CCriticalSection cs;

    void main()

    {

    }

    DWORD WINAPI mythread(LPVOID param)

    {

    cs.Lock();

    cs.Unlock();

    }

    互斥量:

    HANDLE hMutex;

    void main()

    {

           hMutex = CreateMutex(NULL,FALSE,”myownmutex”);

           …

    }

    DWORD WINAPI mythread(LPVOID param)

    {

           WaitForSingleObject(hMutex,INFINITE);    ¬

           …

           ReleaseMutex(hMutex);

    }

    信号量:

    HANDLE hSema;

    void main()

    {

           hSema = CreateSemaphore(NULL,nInit,nMax,”myownsemaphore”);

           …

    }

    DWORD WINAPI mythread(LPVOID param)

    {

           WaitForSingleObject(hSema,5000L);   ¬

           …

           ReleaseSemaphore(hSema,1,NULL);

    }

    事件:

    HANDLE hEvent;

    void main()

    {

           hEvent = CreateEvent(NULL,FALSE,TRUE,”myownevent”);

           …

           WaitForSingleObject(hEvent,INFINITE);     ¬

    }

    DWORD WINAPI mythread(LPVOID param)

    {

           …//操作。。。

           SetEvent(hEvent);

    }

  • 相关阅读:
    Redis计数信号量
    一台服务器能支撑多少个TCP连接
    Python常见字符编码间的转换
    浅谈HttpDNS
    用Python写的一个MySQL数据库监测系统
    用Python写的一个MySQL数据库监测系统
    how tomcat works(第九章)
    how tomcat works(第八章)
    how tomcat works(第八章)
    how tomcat works(第九章)
  • 原文地址:https://www.cnblogs.com/JczmDeveloper/p/3527300.html
Copyright © 2020-2023  润新知