VC线程同步方法

时间:2022-08-19 03:02:49

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&plus;&plus;线程池

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

  2. JAVA中线程同步方法

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

  3. VC&plus;&plus;线程函数内怎么调用外部函数

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

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

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

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

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

  6. C&num;线程同步方法汇总

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

  7. 转&colon;VC&plus;&plus;线程同步-事件对象

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

  8. VC&plus;&plus; 线程同步 总结

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

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

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

随机推荐

  1. Spring MVC学习笔记--认识SpringMVC

    Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块.使用 Spring 可插入的 MVC 架构,可以选择是使用内置的 Spring Web 框架还是 Struts 这样的 Web 框 ...

  2. Ejabberd作为推送服务的优化手段

    AVOS Cloud目前还在用Ejabberd做Android的消息推送服务.当时选择Ejabberd,是因为Ejabberd是一个发展很长时间的XMPP实现,并且基于Erlang,设想能在我们自主研 ...

  3. windows命令行&lpar;Command Prompt &sol; Console&rpar;字体设置

    1.运行 regedit 打开注册表编辑器,打开注册表定位至[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Conso ...

  4. OpenJudge计算概论-寻找山顶

    /*===================================== 寻找山顶 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个m×n的山地上,已知每个地块的平均高程,请 ...

  5. &lbrack;问题解决&rsqb;LaTex 进行中文文档操作

    第一步,在\documentclass后输入 \usepackage{fontspec, xunicode, xltxtra} \usepackage{xeCJK}%中文字体 \setCJKmainf ...

  6. Java 7 for Absolute Beginners&sol;Java 7基础教程--读后感

    1. 很适合部分初学者,因为书中对于JAVA许多特性都有涉猎,而且也是浅尝即止.如果读者没有受过专业的编程训练,那么在阅读此书时不会畏惧.因为书中没有充斥着大量的计算机理论知识,虽然作者依然覆盖了JA ...

  7. 洛谷P2704 炮兵阵地

    本题过于经典...... 对于这种网格状压DP,套路一波刷表法DFS转移就没了. 三进制状压,0表示当前,上一个都没有.1表示当前无,上一个有.2表示当前有. 转移的条件就是上一行为0,当前不是山地, ...

  8. SFTP搭建&commat;windows using freeSHHd&amp&semi;FileZilla

    转自:http://blog.163.com/ls_19851213/blog/static/531321762009815657395/ Windows  xp 下 搭建 基于  ssh 的sftp ...

  9. Ubuntu apt-get提示被锁住

    执行 apt-get 时提示资源被锁住 E: Could not get lock /var/lib/dpkg/lock - open (11: Resource temporarily unavai ...

  10. QPainter、QPainterPath、QBrush

    参考资料: https://blog.csdn.net/qq_35488967/article/details/70802973https://blog.csdn.net/wanghualin033/ ...