zoukankan      html  css  js  c++  java
  • 对windows 线程同步的个人见解

     Windows上线程同步有四种类型: 临界区(CRITICAL_SECTION) ,互斥(Mutex) , 信号量(semahpore),事件(Event);

     1: 临界区(CRITICAL_SECTION) ,临界区是一段代码,在任意给定的时刻只能被一个线程使用,

        如果多个线程企图同时访问临界区,则一次只允许一个线程控区临界区,其余所有线程将被阻塞或保

      持等待,直到临界区被释放出来.

        基本用法:

             //define a global  critical_section

         CRITICAL_SECTION cs;

                void threadproc1(void)

         {

           EnterCriticalSection(&cs);

           //TODO: do sth for here

                        .......

                       LeaveCriticalSection(&cs);

        }

         void main()

          {

           InitializeCriticalSection(&cs);

             ......

           _beginthread(threadproc1,0,NULL);

           DeleteCriticalSection(&cs);

          }

      2:互斥(Mutex) : 一个互斥对象一次只能被一个线程拥有;跟临界区类似,但比临界区复杂.

        基本用法:

             //define a global handle for mutex

            HANDLE ghMutex;

            DWORD WINAPI ThreadProc(LPVOID lpParam)

            {

                 WaitForSingleObject(ghMutex,INFINITE);//获得互斥体对象

              ....

              ReleaseMutex(ghMutex); //交出互斥对象给其它线程使用.

            }

         void main()

         {

           //create a mutex

            ghMutex = CreateMutex(NULL,FALSE,NULL);//注意中间那个FALSE,具体参考MSDN;

            CreateThread(threadProc..);

            //

          }

            3: 信号量 (semahpore) 当应用程序中的多个线程要访问某一资源.可以使用信号量,它并不限制资源一次只被

        一个线程访问.

          基本用法:

          void threadproc(LPVOID lpvoid)

          {

          WaitForSingleObject(hsemaphore,INFINITE);//调用一次,信号量计数减1;为0时,阻塞.

            ..........

            ReleaseSemaphore(hsemaphore,1,NULL);//恢复一个信号量计数 

         }

        void main()

          {

            HANDLE hsemaphore = CreateSemaphore(NULL,3,3,NULL);

          }

       4 :事件(EVENT) ;应用程序在访问某一资源前必须要等待某一事件发生.

        基本用法:

         void main()

           {

              HANDLE hEvent = CreateEvent(NULL,FALSE,TRUE,NULL);

              //注意 第二个参数,与第三个参数意义, 要不要手动调用SetEvent(),ResetEvent()都取决于他们.

              hThread1 = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadProc1,NULL,0,NULL);

            }

          DWORD WINAPI ThreadProc2(LPVOID lpParam)

          {

             DWORD dReturn = WaitForSingleObject(hEvent,INFINITE);//事件有信号,就立即返回,否则阻塞.

           if(WAIT_OBJECT_0 == dReturn)

            {   

             cout <<"Thread1 signaled!"<<endl;

            }

          }

            注意,同步对象在使用完之后,都要使用 CloseHandle()将其释放.

  • 相关阅读:
    10分钟教你用VS2017将代码上传到GitHub
    【算法】C++用链表实现一个箱子排序附源代码详解
    【智能算法】粒子群算法(Particle Swarm Optimization)超详细解析+入门代码实例讲解
    【C/C++】10分钟教你用C++写一个贪吃蛇附带AI功能(附源代码详解和下载)
    【python】10分钟教你用python如何正确把妹
    【python】10分钟教你用python一行代码搞点大新闻
    【python】10分钟教你用python下载和拼接微信好友头像图片
    3. powerdesigner 生成mysql脚本,要求字段、表名有注释
    5. 回填表格复选框
    14. js字符串截取substring用法
  • 原文地址:https://www.cnblogs.com/luisfan/p/2947027.html
Copyright © 2011-2022 走看看