Multithread 之 synchronous

news/2024/7/16 7:25:34
  • 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;
        }
      
  • 参考:
    • 《Win32多线程程序设计》
    • http://www.codeproject.com/KB/threads/sync.aspx

转载于:https://www.cnblogs.com/dahai/archive/2011/07/18/2109767.html


http://www.niftyadmin.cn/n/3612814.html

相关文章

创业在微软——微软亚洲工程院成长启示(双色)

创业在微软——微软亚洲工程院成长启示&#xff08;双色&#xff09; 许凤婷 编著ISBN 978-7-121-13410-4 2011年8月出版定价&#xff1a;39.00元16开424页宣传语&#xff1a;身处软件业巨擘微软&#xff0c;何来创业一说谋士&#xff1f;说客&#xff1f;人贩&#xff1f;IT精…

RTP 与 RTCP 协议

实时传输协议&#xff08;RTP&#xff09;为数据提供了具有实时特征的端对端传送服务&#xff0c;如在组播或单播网络服务下的交互式视频音频或模拟数据。应用程序通常在 UDP 上运行 RTP 以便使用其多路结点和校验服务&#xff1b;这两种协议都提供了传输层协议的功能。但是 RT…

百科词条比较(3)

3. 中文分词 虽然中文分词工具也很多&#xff0c;但没有一个分词工具能像ICTCLAS那样光芒万丈&#xff0c;而且还是免费的&#xff0c;所以就直接用它了。 我们先看下ICTCLAS犀利的简介 &#xff1a; ICTCLAS在国内973专家组组织的评测中活动获得了第一名&#xff0c;在第一届国…

实时传输协议详解

实时传输协议RTP1.RTP协议&#xff1a;RTP&#xff08; Real-time Transport Protocol&#xff09;协议最初是在70年代为了尝试传输声音文件&#xff0c;把包分成几部分用来传输语音&#xff0c;时间标志和队列号。经过一系列发展&#xff0c;RTP第一版本在 1991年8月由美国的一…

Android 要想美化就用Shape

如果你对Android系统自带的UI控件感觉不够满意&#xff0c;可以尝试下自定义控件&#xff0c;我们就以Button为例&#xff0c;很早以前Android就写到过Android Button按钮控件美化方法里面提到了xml的selector构造。当然除了使用drawable这样的图片外今天eoeAndroid谈下自定义图…

mootools实现重用ajax提交方式

例如: js 对象: data 包含(field1,field2,field3....) java 对象 PO 也包含 field1,field2,field3..... 这两个对象属性不一定完全一致, 但是你希望他们一致的地方能直接通过ajax 请求到servlet时,直接自动转换, 不需要人为的去 request.getParameter("field1") 然后…

斯坦福大学公开课 iPhone开发教程

已经翻译到第十集http://v.163.com/special/opencourse/iphonekaifa.html转载于:https://www.cnblogs.com/gamesacer/archive/2011/08/03/2125774.html

FFMpeg 中比较重要的函数以及数据结构

FFMpeg 中比较重要的函数以及数据结构如下&#xff1a; 1. 数据结构&#xff1a; (1) AVFormatContext (2) AVOutputFormat (3) AVInputFormat (4) AVCodecContext (5) AVCodec (6) AVFrame (7) AVPacket (8) AVPicture (9) AVStream 2. 初始化函数&#xff1a; (1…