VC线程同步方法
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线程同步方法的更多相关文章
- 老版VC++线程池
在一般的设计中,当需要一个线程时,就创建一个,但是当线程过多时可能会影响系统的整体效率,这个性能的下降主要体现在:当线程过多时在线程间来回切换需要花费时间,而频繁的创建和销毁线程也需要花费额外的机器指 ...
- JAVA中线程同步方法
JAVA中线程同步方法 1 wait方法: 该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所 ...
- VC++线程函数内怎么调用外部函数
VC++线程函数内怎么调用外部函数 1.把外部函数做成静态函数,就可以直接调用了.2.把外部函数所在的对象通过线程函数参数传到线程里面来,这样线程里可以使用此对象及其函数了.
- java 线程同步方法执行与唤醒实例
账号提钱.存钱实例方法 public class Account { private int balance; private int maxBalance; public Account(int b ...
- Java基础之线程——管理线程同步方法(BankOperation2)
控制台程序. 当两个或多个线程共享同一资源时,例如文件或内存块,就需要采取措施,确保其中的一个线程不会修改另一个线程正在使用的资源.当其中的一个线程更新文件中的某个记录,同时另一个线程正在检索这个记录 ...
- C#线程同步方法汇总
我们在编程的时候,有时会使用多线程来解决问题,比如你的程序需要在 后台处理一大堆数据,但还要使用户界面处于可操作状态:或者你的程序需要访问一些外部资源如数据库或网络文件等.这些情况你都可以创建一个子线 ...
- 转:VC++线程同步-事件对象
这是整理孙鑫VC得到的关于线程同步方面的笔记. n 事件对象也属于内核对象,包含一个使用计数,一个用于指明该事件是一个自动重置的事件还是一个人工重置的事件的布尔值,另一个用于指明该事件处于 ...
- VC++ 线程同步 总结
注:所谓同步,并不是多个线程一起同时执行,而是他们协同步调,按预定的先后次序执行. 与线程相关的基本函数包括:CreateThread:创建线程CloseHandle:关闭线程句柄.注意,这只会使指定 ...
- VC线程中操作控件,引起程序卡死的问题。
[问题还原] 线程中操作控件,具体为控制一个按键的使能,使能后结束线程. 主程序中有一个死循环,等待线程结束. 然后,就没有然后了-- [解决方案] 在主程序死循环中,如果检测到界面消息,优先处理掉.
随机推荐
- 由于拷贝的文件太大,不可能一直开着SHELL,所以让SCP后台运行
原文地址: http://blog.itpub.net/90618/viewspace-750822/ 1:开一个终端,scp命令运行后,输入密码让其拷贝 # scp chris@221.179.1. ...
- 【docker】docker基础原理,核心技术简介
关于docker的核心技术,就是以下的三大技术: 1.namespaces [命名空间] 使用linux的命名空间实现的进程间隔离.Docker 容器内部的任意进程都对宿主机器的进程一无所知. 除了进 ...
- 【BZOJ】【2741】【FOTILE模拟赛】L
可持久化Trie+分块 神题……Orz zyf & lyd 首先我们先将整个序列搞个前缀异或和,那么某一段的异或和,就变成了两个数的异或和,所以我们就将询问[某个区间中最大的区间异或和]改变成 ...
- GUI程序设计2
8. 按钮(JButton)使用示例 例14. 按钮使用示例. package GUI; import java.awt.BorderLayout; import java.awt.Container ...
- Objective-C:保留计数器思想的详解(对象的保留和所有权的释放)
对象的保留和所有权的释放: int main(int agrs,char *argv[]) { @autoreleasepool{ Person *person = [[Person alloc]in ...
- 第二十三章 springboot + 全局异常处理
一.单个controller范围的异常处理 package com.xxx.secondboot.web; import org.springframework.web.bind.annotation ...
- ADB用法
作为android开发人员,adb是常用的工具之一.具体怎么使用了. 1. 安装完ADB后(ADB的安装请参考<Android开发平台搭建及配置.doc>),用电脑USB连接机器,然后使用 ...
- linux CentOS7 安装spark
上次安装了scala-2.11.8,这次安装spark-2.1.0版本 1.下载spark-2.1.0 打开terminal 进入当前用户目录 /home/sks wget http://d3kbcq ...
- 协定须要双工,可是绑定“WSHttpBinding”不支持它或者因配置不对而无法支持它
协定须要双工,可是绑定"WSHttpBinding"不支持它或者因配置不对而无法支持它 下面两种情况,我都遇到过. 一, < endpoint address =" ...
- linux用户管理中两个重要的“父子”配置文件
在Linux中主要通过用户配置文件来查看和修改用户信息,因此下面我们将介绍两个重要的用户配置文件,让你能够更好的hold住你的用户. 一:父文件/etc/passwd 1.查看配置文件/etc/pas ...