zoukankan      html  css  js  c++  java
  • Multithread 之 synchronous

    • Critical Sections(临界区):用来实现“排他性占用”。适用范围是单一进程的各线程之间。
      • 一个局部对象,不是一个核心对象
      • 快速而有效率
      • 不能同时有一个以上的Critical Section被等待
      • 无法侦测是否已被某个线程放弃
      • 例子:
          #include <windows.h>
        
          #include <process.h>
        
          #include <stdio.h>
        
          
          CRITICAL_SECTION cs;
          int a[ 5 ];
          
          void Thread( void* pParams )
          {
            int i, num = 0;
          
            while ( TRUE )
            {
               EnterCriticalSection( &cs );
               for ( i = 0; i < 5; i++ ) a[ i ] = num;
               LeaveCriticalSection( &cs );
               num++;
            }
          }
          
          int main( void )
        
          { 
            InitializeCriticalSection( &cs );
            _beginthread( Thread, 0, NULL );
          
            while( TRUE )
            {
               EnterCriticalSection( &cs );
               printf( "%d %d %d %d %d\n", 
                       a[ 0 ], a[ 1 ], a[ 2 ],
                       a[ 3 ], a[ 4 ] );
               LeaveCriticalSection( &cs );
            }
            return 0;
          }
        
    • Mutexes(互斥器):是一个核心对象,可以在不同的线程之间实现“排他性占用”,甚至即使那些线程分属不同进程
      • 一个核心对象
      • 如果拥有mutex的那个线程结束,则会产生一个“abandoned”错误信息
      • 可以使用Wait...()等待一个mutex
      • 可以指定名称,因此可以被其他进程开启
      • 只能被拥有它的那个线程释放
      • 例子:
          #include <windows.h>
        
          #include <process.h>
        
          #include <stdio.h>
        
          
          HANDLE hMutex;
          int a[ 5 ];
          
          void Thread( void* pParams )
          { 
             int i, num = 0;
          
             while ( TRUE )
             { 
                WaitForSingleObject( hMutex, INFINITE );
                for ( i = 0; i < 5; i++ ) a[ i ] = num;
                ReleaseMutex( hMutex );
                num++;
             }
          }
          
          int main( void )
          {
             hMutex = CreateMutex( NULL, FALSE, NULL );
             _beginthread( Thread, 0, NULL );
          
             while( TRUE )
        
             {
                WaitForSingleObject( hMutex, INFINITE );
                printf( "%d %d %d %d %d\n", 
                        a[ 0 ], a[ 1 ], a[ 2 ],
                        a[ 3 ], a[ 4 ] );
                ReleaseMutex( hMutex );
             }
             return 0;
          }
        
    • Semaphores(信号量):被用来追踪有限的资源
      • 一个核心对象
      • 没有拥有者
      • 可以指定名称,因此可以被其他进程开启
      • 可被任一线程释放
      • 例子:
    • Event Objects(事件):通常适用于overlapped I/O,或用来设计某些自定义的同步对象
      • 一个核心对象
      • 完全在程序掌控之下
      • 适用于设计新的同步对象
      • “要求苏醒”的请求不会被储存起来,可能会遗失掉
      • 可以指定名称,因此可以被其他进程开启
      • 例子:
          #include <windows.h>
        
          #include <process.h>
        
          #include <stdio.h>
        
          
          HANDLE hEvent1, hEvent2;
          int a[ 5 ];
          
          void Thread( void* pParams )
          {
             int i, num = 0;
        
             while ( TRUE )
             {
                WaitForSingleObject( hEvent2, INFINITE );
                for ( i = 0; i < 5; i++ ) a[ i ] = num;
                SetEvent( hEvent1 );
                num++;
             }
          }
          
          int main( void )
          {
             hEvent1 = CreateEvent( NULL, FALSE, TRUE, NULL );
             hEvent2 = CreateEvent( NULL, FALSE, FALSE, NULL );
          
             _beginthread( Thread, 0, NULL );
          
             while( TRUE )
             { 
                WaitForSingleObject( hEvent1, INFINITE );
                printf( "%d %d %d %d %d\n", 
                        a[ 0 ], a[ 1 ], a[ 2 ],
                        a[ 3 ], a[ 4 ] );
                SetEvent( hEvent2 );
             }
             return 0;
          }
        
    • 参考:
  • 相关阅读:
    Spring data jpa 之 Query update的坑
    【LeetCode-204】--计算[2,n]的所有质数--
    MySQL replace into那些隐藏的风险
    Error CREATEing SolrCore 'new_core': Unable to create core [new_core] Caused by: Can't find resource 'solrconfig.xml' in classpath or 'D: oolsolrhome ew_core'
    idea 启动项目报错Error running 'tomcat': Unable to open debugger port (127.0.0.1:38667): java.net.SocketException "socket closed
    mysql定时备份数据
    ubuntu配置网络和静态路由(界面配置形式)
    【Mybatis-Plus学习笔记(九)】通用Service
    【Mybatis-Plus学习笔记(八)】基本配置
    【Mybatis-Plus学习笔记(七)】主键策略
  • 原文地址:https://www.cnblogs.com/dahai/p/2109767.html
Copyright © 2011-2022 走看看