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. DIOCP

    DIOCP GITHUB: https://github.com/ymofen/diocp-v5.git diocp5====== ## 快速开始 从那里得到: git更新(推荐同步更新) 1.htt ...

  2. FIREDAC不能识别SQL的某些字段类型

    FIREDAC不能识别SQL的某些字段类型 经常见有网友有类似的提问:请问各位,在DataSnap中使用SQL数据SUM函数,如果是统计浮点型数值的话,返回是乱码,哪位是什么原因?  其实这不是DAT ...

  3. Extjs GridPanel 监听事件 行选中背景

    Extjs设置GridPanel选中行背景色和选中单元格背景色 var view = grid.getView(); view.getRow(index).style.backgroundColor  ...

  4. 【docker】关于docker中挂载的解释

    现在有这么一个命令: docker run -p 33061:3306 --name mysql --restart=always -e MYSQL_ROOT_PASSWORD=pisen -v /e ...

  5. .NET:CLR via C# The Interlocked Anything Pattern

    Many people look at the Interlocked methods and wonder why Microsoft doesn't create a richer set of ...

  6. [Android] osx下如何使用SublimeText阅读Android系统源码

    reference to : http://www.jianshu.com/p/c295d2729ecf 平时使用Sublimetext都是打开单个文件,这次要导入几万个文件,这在一些ide中称为pr ...

  7. hbase数据模型以及编码压缩(转)

    原文链接:hbase源码系列(四)数据模型-表定义和列族定义的具体含义 hbase是一个KeyValue型的数据库,在<hbase实战>描述它的逻辑模型[行键,列族,列限定符,时间版本], ...

  8. MySQL中的模糊查询和通配符转义

    MySQL中实现模糊查询有2种方式:一是用LIKE/NOT LIKE,二是用REGEXP/NOT REGEXP(或RLIKE/NOT RLIKE,它们是同义词). 第一种是标准的SQL模式匹配.它有2 ...

  9. 我所遭遇过的游戏中间件---Redux

    我所遭遇过的游戏中间件---Redux 一.关于Redux Substance Redux 是一款纹理处理软件加中间件,专门用于纹理生成和压缩.具其用户指南介绍,它能够对纹理集进行优化,可以将现有压缩 ...

  10. 用js做一个简单的留言板效果

    html部分: 1: <!DOCTYPE> 2: <html lang="zh-en"> 3: <head> 4: <title>j ...