zoukankan      html  css  js  c++  java
  • 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);

    }

  • 相关阅读:
    ios 一个正则表达式测试(只可输入中文、字母和数字)
    IOS7 8中tableview分割线缺少15像素
    Java中使用OpenSSL生成的RSA公私钥进行数据加解密
    java与IOS之间的RSA加解密
    ios下使用rsa算法与php进行加解密通讯
    C# 32位md5
    [原]命令模式在MVC框架中的应用
    [原]【推荐】程序员必读的三十本经典巨作
    [原]容器学习(二):动手模拟AOP
    [原]容器学习(一):动手模拟spring的IoC
  • 原文地址:https://www.cnblogs.com/JczmDeveloper/p/3527300.html
Copyright © 2011-2022 走看看