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线程中操作控件,引起程序卡死的问题。
[问题还原] 线程中操作控件,具体为控制一个按键的使能,使能后结束线程. 主程序中有一个死循环,等待线程结束. 然后,就没有然后了-- [解决方案] 在主程序死循环中,如果检测到界面消息,优先处理掉.
随机推荐
- Dictionary GetOrAdd
public static TValue GetOrAdd<TKey,TValue>( this Dictionary<TKey,TValue> dictionary, TKe ...
- python测试开发django-7.django模板继承(block和extends)
前言 打开一个网站时候,点导航栏切换到不同的页面,发现导航部分是不变的,只是页面的主体内容变了,于是就可以写个母模板,其它的子页面继承母模板就可以了. 母模板 可以在母模板中添加多个块标签,每个块标签 ...
- window.open("url?param="+paramvalue) 服务端 乱码问题解决
window.open("url?param="+paramvalue)传递参数出现乱码,在客房端显示是正常的,可是到服务端就是乱码. 1. 利用一个js在客户端转码的函数,esc ...
- [集合框架] List 实现
List 实现分为通用 List 实现和特殊用途的 List 实现. 通用 List 实现 有两个通用的 List 实现 —— ArrayList 和 LinkedList.大多数时候,你可能会使用 ...
- Windows 7系统垃圾清理自写程序
系统清理.bat @echo off color 0a title windows7系统垃圾清理--- echo ★☆ ★☆ ★☆ ★☆ ★☆★☆★☆ ★☆ ★☆ ★☆ ★☆★ echo ★☆ ★☆ ...
- OpenCV学习(28) 轮廓
OpenCV中可以方便的在一副图像中检测到轮廓,并把这些轮廓画出来.主要用到两个函数:一个是findContours( img, contours0, hierarchy, RETR_TREE, CH ...
- Strings of Power
B. Strings of Power Volodya likes listening to heavy metal and (occasionally) reading. No wonder Vol ...
- nginx配置解决vue单页面打包文件大,首次加载慢的问题
cnpm run build 文件过大,其中主要是vender.js有1.5M,代码部署到服务器,首次访问加载页面时比较慢,耗时6.5s左右,所以需要优化下. 1.Nginx开启gzip 找到ngin ...
- 【NodeJS】nvm、npm、node安装、使用、淘宝源设置等资料
NodeJS-安装使用淘宝源 管理 node 版本,选择 nvm 还是 n? - WEB前端 - 伯乐在线 creationix/nvm: Node Version Manager - Simple ...
- 【RPC】Thrift ICE 等 RPC 框架相关资料
RPC框架-Thrift-ICE Apache Thrift - Documentation Apache Thrift - Index of tutorial/ Apache Thrift - Ab ...