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;
          }
        
    • 参考:
  • 相关阅读:
    #《Essential C++》读书笔记# 第四章 基于对象的编程风格
    visual studio 2019:error c2760
    #《Essential C++》读书笔记# 第三章 泛型编程风格
    #《Essential C++》读书笔记# 第二章 面向过程的编程风格
    #《Essential C++》读书笔记# 第一章 C++ 编程基础
    Hello, world!
    Linux基础(五)Linux下的文件操作
    Linux基础(四)新手大礼包,Linux需要掌握的基础命令大合集
    Linux基础(三)安装Linux系统中遇到的问题
    Linux基础(二)在vmwaer虚拟机 上安装Linux操作系统
  • 原文地址:https://www.cnblogs.com/dahai/p/2109767.html
Copyright © 2011-2022 走看看