临界段CCriticalSection的使用
2016-01-22 14:09
330 查看
类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。临界区在控制一次只有一个线程修改数据或其它的控制资源时非常有用。例如,在链表中增加一个结点就只允许一次一个线程进行。通过使用CCriticalSection对象来控制链表,就可以达到这个目的。它就像是一把钥匙,哪个线程获得了它就获得了运行线程的权力,而把其他线程统统阻塞。
CCriticalSection类的构造函数原型如下:
CCriticalSection()
可以发现这个类的构造函数没有参数,所以创建一个CCriticalSection类的对象非常简单,只有如下即可:
CCriticalSection criticalSection;
示例:使用临界段编写一个有两个线程的应用程序。
1.创建单文档应用程序;
2.在视图类的实现文件中定义一个临界段对象:
CCriticalSection criticalSection;
3.在视图类的实现文件中定义两个线程函数:
UINT MessageThread1(LPVOID pParam)
{
criticalSection.Lock();
LPTSTR pMessage = _T("Thread1 is started");
CWnd *pMainWnd = AfxGetMainWnd();
::MessageBox(pMainWnd->m_hWnd, pMessage, _T("Thread message"), MB_OK);
criticalSection.Unlock();
return 0;
}
UINT MessageThread2(LPVOID pParam)
{
criticalSection.Lock();
LPTSTR pMessage = _T("Thread2 is started");
CWnd *pMainWnd = AfxGetMainWnd();
::MessageBox(pMainWnd->m_hWnd, pMessage, _T("Thread message"), MB_OK);
criticalSection.Unlock();
return 0;
}
4.在视图类鼠标左键消息函数编写如下:
void CThreadTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
AfxBeginThread(MessageThread1, _T("Thread is started")); //启动线程1
AfxBeginThread(MessageThread2, _T("Thread is started")); //启动线程2
CView::OnLButtonDown(nFlags, point);
}
CCriticalSection类的构造函数原型如下:
CCriticalSection()
可以发现这个类的构造函数没有参数,所以创建一个CCriticalSection类的对象非常简单,只有如下即可:
CCriticalSection criticalSection;
示例:使用临界段编写一个有两个线程的应用程序。
1.创建单文档应用程序;
2.在视图类的实现文件中定义一个临界段对象:
CCriticalSection criticalSection;
3.在视图类的实现文件中定义两个线程函数:
UINT MessageThread1(LPVOID pParam)
{
criticalSection.Lock();
LPTSTR pMessage = _T("Thread1 is started");
CWnd *pMainWnd = AfxGetMainWnd();
::MessageBox(pMainWnd->m_hWnd, pMessage, _T("Thread message"), MB_OK);
criticalSection.Unlock();
return 0;
}
UINT MessageThread2(LPVOID pParam)
{
criticalSection.Lock();
LPTSTR pMessage = _T("Thread2 is started");
CWnd *pMainWnd = AfxGetMainWnd();
::MessageBox(pMainWnd->m_hWnd, pMessage, _T("Thread message"), MB_OK);
criticalSection.Unlock();
return 0;
}
4.在视图类鼠标左键消息函数编写如下:
void CThreadTestView::OnLButtonDown(UINT nFlags, CPoint point)
{
AfxBeginThread(MessageThread1, _T("Thread is started")); //启动线程1
AfxBeginThread(MessageThread2, _T("Thread is started")); //启动线程2
CView::OnLButtonDown(nFlags, point);
}
相关文章推荐
- 接口继承与实现继承
- iOS Mob短信验证码
- 使用FreeType实现DirectX11的文本输入
- 如何将url作为一个参数放到另一个url中
- opencv:Load Caffe framework models
- 【spring源代码分析】--Bean的解析与注冊
- 邻接矩阵学习
- ubuntu编译安装nginx
- 样式化复选框
- 在Linux上安装Memcached服务
- 判断字符串是否为中文
- 数字证书原理
- ft232rl可以了
- Hive学习1_hive配置遇到的问题:Relative path in absolute URI: ${system:java.io.tmpdir%7D/$%7Bsystem:user.name%
- mmnl进程无故终止的一些事
- C++:运算符重载1(分数的加法)
- /dev/null 的含义和用途
- 【转】Spark是基于内存的分布式计算引擎
- 被遗忘的 Logrotate
- IOS开发:手势画板涂鸦