对多线程学习心得。。

 一  临界区

      1  相关问题

             多个线程同时访问一段代码,例如:printf();

       2  临界区

            锁定一段代码,防止多个线程同时使用该代码。

      3  使用方法

           3.1 初始化临界区

                   void InitializeCriticalSection(LPCRITICAL_SECTION lpCriticalSection) ; //LPCRITICAL_SECTION lpCriticalSection 临界区变量

          3.2 进入临界区

                  void EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

          3.3 离开临界区

                 void LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

          3.4  删除临界区

                 void DeleteCriticalSection(LPCRITICAL_SECTION lpCriticalSection);

例子:

#include "stdafx.h"
#include "windows.h"
#include "stdio.h"


CRITICAL_SECTION cs = { 0 };//临界区变量

//线程一

DWORD WINAPI TestProc1( LPVOID pParam ){
 while(1){
  EnterCriticalSection( &cs );//进入临界资源
  printf( "Long long long-------------------\n" );
  Sleep( 500 );
  LeaveCriticalSection( &cs );//离开临界资源
 }
 return 0;
}

//线程二

DWORD WINAPI TestProc2( LPVOID pParam ){
 while(1){
  EnterCriticalSection( &cs );
  printf( "-------------------Long long long\n" );
  Sleep( 1000 );
  LeaveCriticalSection( &cs );
 }
 return 0;
}
void Critical( ){
 InitializeCriticalSection( &cs );//初始化临界资源
 DWORD nID = 0;//创建线程标识

 HANDLE hThread[2] = { 0 };
 hThread[0] = CreateThread( NULL, 0, TestProc1, NULL, 0, &nID );
 hThread[1] = CreateThread( NULL, 0, TestProc2, NULL, 0, &nID );
 WaitForMultipleObjects( 2, hThread, TRUE, INFINITE );
 CloseHandle( hThread[0] );
 CloseHandle( hThread[1] );
 DeleteCriticalSection( &cs );//释放临界资源
}

int main(int argc, char* argv[])
{
 Critical( );
 return 0;
}

二 事件

 1  相关问题

       程序之间通信问题

  2  事件的使用

     2.1  创建事件

       HANDLE CreateEvent(
                              LPSECURITY_ATTRIBUTES lpEventAttributes,       // 安全属性
                              BOOL bManualReset,            // 复位方式              
                              BOOL bInitialState,       // 初始状态                  
                              LPCTSTR lpName           // 事件名称                   
                              );//创建成功,返回事件句柄。

      2.2 等候事件
         WaitForSingleObject
         WaitForMultipleObjects

     2.3 触发事件(事件由无信号到有信号状态)
        BOOL SetEvent(
               HANDLE hEvent   // 事件的句柄
          );

     2.4 将事件置为无信号状态
        BOOL ResetEvent(
            HANDLE hEvent //事件的句柄
     );

   2.5 关闭事件
        CloseHandle
 例子:
#include "stdafx.h"
#include "windows.h"
#include "stdio.h"
HANDLE hEvent = 0;
DWORD WINAPI TestProc1( LPVOID pParam ){
 while(1){
  WaitForSingleObject( hEvent, INFINITE );
//  ResetEvent( hEvent );
  printf( "Hello World\n" );
 }
 return 0;
}

DWORD WINAPI TestProc2( LPVOID pParam ){
 while(1){
  Sleep( 1000 );
  printf( "love love\n");
  SetEvent( hEvent );
 }
 return 0;
}

void Event( ){
 hEvent = CreateEvent( NULL, FALSE, FALSE, NULL );
 DWORD nId = 0;
 HANDLE hThread[2] = { 0 };
 hThread[0] = CreateThread( NULL, 0, TestProc1, NULL, 0, &nId );
 hThread[1] = CreateThread( NULL, 0, TestProc2, NULL, 0, &nId );
 WaitForMultipleObjects( 2, hThread, TRUE, INFINITE );
 CloseHandle( hThread[0] );
 CloseHandle( hThread[1] );
 CloseHandle( hEvent );
}

int main(int argc, char* argv[])
{
 Event( );
 return 0;
}

三 互斥 Mutex

   1 相关问题

            多线程下代码或资源共享

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值