VC MFC中线程同步对象的区别

临界区 CCriticalSection,在用户模式工作,适用于保护线程间共享资源,一个线程可以多次Lock不会出错。不支持在多进程之间工作。

互斥量 CMutex,在内核模式工作,除了支持临界区的功能,还可以为互斥量命名,以便在多进程中工作。互斥量比临界区耗资源。

 事件  CEvent,在内核模式工作,适用于一个线程等待另一个线程完成某任务。

信号量 CSemaphore,在内核模式工作,适用于允许特定个数的线程执行某任务。

实例:

CwinThread *pThread;

1、使用互斥对象
   HANDLE hMutex;

hMutex = CreateMutex(NULL , false, "mutex");
  
 
   线程函数使用:
   WaitForSingleObject(hMutex,INFINITE);
   {
   }
   ReleaseMutex(hMutex);

<2>
   CMutex Section;
   线程函数中使用
   CsingleLock singlelock;
   singlelock(&Section);
   singlelock.lock();
   singlelock.Unlock();

2、使用事件对象
  
   1 > 第一种实用方式:
   HANDLE hEvent;

线程函数中使用:
   WaitForSingleObject(hEvent,INFINITE);
   {
   }
   SetEvent(hEvent);

hEvent = CreateEvent(NULL,FALSE,TRUE,"event");//自动重置对象,通知状态
   SetEvent(hEvent);//为通知状态
   ResetEvent(hEvent);//未通知状态
 
 
3、实用临界区对象
  
   <1>
   CRITICAL_SECTION  Section;
  
   InitializeCriticalSection(&Section);

线程中实用
   EnterCriticalSection(&Section);
   {
   }
   LeaveCriticalSection(&Section);
   <2>
   
   CCriticalSection Section;
  
   线程中使用
   Section.Lock();
   Section.Unlock();

4、线程启动
  pThread = AfxBeginthread(thradfunction,hwnd);
  pThread->m_bAutoDelete = FALSe;//线程为手动删除

在OnDestory()
  {
    WaitForSingleObject(pThread->m_hThread,INFINITE);//等待线程的结束
    delete pThread;
  }
5、线程通讯
   1> ::PostMessage((HWND),WM_USERMSG,0,0);
   2> CwinThread::PostThradMessage();

使用事件对象
 2 >Cevent threadStart,threadEnd;
     UINT ThreadFunction(LPVOID pParam)
     {
      ::WaitForSingleObject(threadStart.m_hObject,INFINITE);
      Sleep(1000);
      ::WaitForSingleObject(threadEnd.m_hObject,INFINITE);
      ::PostMessage(hWnd,WM_USERMSG,0,0);
     }
    
     A()
     {
          threadStart.SetEvent();
          pThread = AfxBeginThread(ThreadFunction,hWnd);
          pThread->m_bAutoDelete = FALSE;
          delete pThread;
     }

6、使用信号量,可以同时让多个线程共访同一个资源
   Csemaphor *semaphore;
   semaphore = new Csemaphore(2,2);
   线程函数中使用:
   Csinglelock singleLock(semahore);
   singlelock.Lock();

(二)、项目中使用
1、使用全局的线程调用,(使用信号量 CRITICAL_SECTION   g_Send_EMM_Cs;)
在一个文件中如:Scrambler.cpp中
InitializeCriticalSection(&g_Send_EMM_Cs);//需要初始化
//发送CW到ECMG A线程
UINT SendCWToECMGAThread(LPVOID lParam)
{
EnterCriticalSection(&g_Send_EMM_Cs);
{
  
}
LeaveCriticalSection(&g_Send_EMM_Cs);
}

可以在其他文件中(如Fmain.cpp中调用)
AfxBeginThread(SendCWToECMGAThread, pDoc);

需要在StdAfx.h中声明
extern UINT SendCWToECMGAThread(LPVOID lParam);

2、使用类内部调用(使用WINAPI)
在MainFrm.h中声明:
static DWORD WINAPI ConnectServerOutTime(LPVOID lpParameter);//连接服务器线程超时
在MainFrm.cpp中调用
HANDLE hTreadTime;
hTreadTime = CreateThread(NULL,0,CMainFrame::ConnectServerOutTime,NULL,0,NULL);
hMutex = CreateMutex(NULL,TRUE,NULL);//创建互斥
CloseHandle(hTreadTime);
则会执行:
//启动的线程
DWORD WINAPI CMainFrame::ConnectServerOutTime(LPVOID lpParameter)
{
    if( WAIT_TIMEOUT == WaitForSingleObject(hMutex,2000) )超时两秒
    return 0 ;
}

3、使用事件句柄
HANDLE      g_hEcmEvent[3];
g_hEcmEvent[0] = CreateEvent(NULL,TRUE,FALSE,NULL);//创建事件
UINT SendCWToECMGAThread(LPVOID lParam)
{
 if(WaitForSingleObject(g_hEcmEvent[0], 4000) == WAIT_OBJECT_0)
 {
 
 }
}
可以在其他地方:
SetEvent(g_hEcmEvent[0]);
ResetEvent(g_hEcmEvent[0]);

VC线程同步方法的更多相关文章

  1. 老版VC++线程池

    在一般的设计中,当需要一个线程时,就创建一个,但是当线程过多时可能会影响系统的整体效率,这个性能的下降主要体现在:当线程过多时在线程间来回切换需要花费时间,而频繁的创建和销毁线程也需要花费额外的机器指 ...

  2. JAVA中线程同步方法

    JAVA中线程同步方法 1  wait方法:         该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所 ...

  3. VC++线程函数内怎么调用外部函数

    VC++线程函数内怎么调用外部函数 1.把外部函数做成静态函数,就可以直接调用了.2.把外部函数所在的对象通过线程函数参数传到线程里面来,这样线程里可以使用此对象及其函数了.

  4. java 线程同步方法执行与唤醒实例

    账号提钱.存钱实例方法 public class Account { private int balance; private int maxBalance; public Account(int b ...

  5. Java基础之线程——管理线程同步方法(BankOperation2)

    控制台程序. 当两个或多个线程共享同一资源时,例如文件或内存块,就需要采取措施,确保其中的一个线程不会修改另一个线程正在使用的资源.当其中的一个线程更新文件中的某个记录,同时另一个线程正在检索这个记录 ...

  6. C#线程同步方法汇总

    我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在 后台处理一大堆数据,但还要使用户界面处于可操作状态:或者你的程序需要访问一些外部资源如数据库或网络文件等.这些情况你都可以创建一个子线 ...

  7. 转:VC++线程同步-事件对象

    这是整理孙鑫VC得到的关于线程同步方面的笔记. n       事件对象也属于内核对象,包含一个使用计数,一个用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值,另一个用于指明该事件处于 ...

  8. VC++ 线程同步 总结

    注:所谓同步,并不是多个线程一起同时执行,而是他们协同步调,按预定的先后次序执行. 与线程相关的基本函数包括:CreateThread:创建线程CloseHandle:关闭线程句柄.注意,这只会使指定 ...

  9. VC线程中操作控件,引起程序卡死的问题。

    [问题还原] 线程中操作控件,具体为控制一个按键的使能,使能后结束线程. 主程序中有一个死循环,等待线程结束. 然后,就没有然后了-- [解决方案] 在主程序死循环中,如果检测到界面消息,优先处理掉.

随机推荐

  1. 图文详解 Android Binder跨进程通信机制 原理

    图文详解 Android Binder跨进程通信机制 原理 目录 目录 1. Binder到底是什么? 中文即 粘合剂,意思为粘合了两个不同的进程 网上有很多对Binder的定义,但都说不清楚:Bin ...

  2. e为无理数的证明

      from: http://math.fudan.edu.cn/gdsx/XXYD.HTM

  3. 使用socket编程实现一个简单的文件服务器

    使用socket编程实现一个简单的文件服务器.客户端程序实现put功能(将一个文件从本地传到文件服务器)和get功能(从文件服务器取一远程文件存为本地文件).客户端和文件服务器不在同一台机器上. pu ...

  4. Cesium应用篇:1快速搭建 【转】

    范例中所有范例可以在Github中搜索:ExamplesforCesium Cesium ['siːzɪəm]是一款开源的JavaScript开源库,开发者通过Cesium,实现无插件的创建三维球和二 ...

  5. Linked List Cycle leetcode java (链表检测环)

    题目: Given a linked list, determine if it has a cycle in it. Follow up: Can you solve it without usin ...

  6. Javascript 中“靠”的使用

    Javascript中call的使用自己感觉蛮纠结的,根据文档很好理解,其实很难确定你是否真正的理解. call 方法应用于:Function 对象调用一个对象的一个方法,以另一个对象替换当前对象.c ...

  7. YUI+Ant 实现JS CSS压缩

    今天研究了一下YUI yahoo开源框架,感觉很猛啊. 于是乎我做了一个YUI的ant实现,网上好多关于bat的实现,我就另辟蹊径,出个关于这个的ant实现,嘿嘿独一无二的文章,如果转载的话,其注明作 ...

  8. php过滤文字中的表情字符和mysql服务端对emoji的支持

    1.过滤emoji表情的原因 在我们的项目开发中,emoji表情是个麻烦的东西,即使我们可以能存储,也不一定能完美显示,因为它的更新速度很快:在iOS以外的平台上,例如PC或者android.如果你需 ...

  9. eclipse全屏模式

  10. DockerHub基于Github自己主动化构建

    Docker Hub上的自己主动化构建 关于自己主动化构建 自己主动化构建是一个特殊的功能,它同意您在 Docker Hub 上使用构建集群,依据指定的 Dockerfile 或者 GitHub . ...