C++线程同步 CCRITICALSECTION(临界区类)附自己写的测试代码
来源:互联网 发布:阿哥阿妹-网络 编辑:程序博客网 时间:2024/06/06 12:30
当多个线程访问一个独占性共享资源时,可以使用“临界区”对象。任一时刻只有一个线程可以拥有临界区对象,拥有临界区的线程可以访问被保护起来的资源或代码段,其他希望进入临界区的线程将被挂起等待,直到拥有临界区的线程放弃临界区时为止,这样就保证了不会在同一时刻出现多个线程访问共享资源。
CCriticalSection类的用法如下:
定义CCriticalSection类的一个全局对象(以使各个线程均能访问),如CCriticalSection critical_section;
在访问需要保护的资源或代码之前,调用CCriticalSection类的成员Lock()获得临界区对象: critical_section.Lock();
在线程中调用该函数来使线程获得它所请求的临界区。如果此时没有其它线程占有临界区对象,则调用Lock()的线程获得临界区;否则,线程将被挂起,并放入到一个系统队列中等待,直到当前拥有临界区的线程释放了临界区时为止。
访问临界区完毕后,使用CCriticalSection的成员函数Unlock()来释放临界区: critical_section.Unlock();
再通俗一点讲,就是线程A执行到critical_section.Lock();语句时,如果其它线程(B)正在执行critical_section.Lock();语句后且critical_section. Unlock();语句前的语句时,线程A就会等待,直到线程B执行完critical_section. Unlock();语句,线程A才会继续执行
其实我就是在网上搜了上面这段话,c++也是3天前才开始学的,对它的多线程也不了解。然后花了2小时来折腾,终于写出来了一个能够测试CCriticalSection的代码。
代码测试环境vs2008,win7
// Win32ConsoleTest.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include
#include //vs2005以上版本都是这么写的
#include
#include
CCriticalSection MyCriticalSection;
//临界区类用来锁定线程对公用变量的访问
DWORD
WINAPI FunctionAdd(
LPVOID
lpParameter);
//thread data 一定要先声明
DWORD
WINAPI FunctionDeduct(
LPVOID
lpParameter);
//thread data
int
num=100;
//计数器
int
_tmain(
int
argc, _TCHAR* argv[])
{
HANDLE
hThread1;
HANDLE
hThread2;
//创建线程
hThread1=CreateThread(NULL,0,FunctionAdd,NULL,0,NULL);
hThread2=CreateThread(NULL,0,FunctionDeduct,NULL,0,NULL);
getch();
//按任意键退出
return
0;
}
DWORD
WINAPI FunctionAdd(
PVOID
arg)
//加法函数
{
while
(1)
{
MyCriticalSection.Lock();
num++;
printf
(
"执行了num++:%d\n"
,num);
MyCriticalSection.Unlock();
Sleep(100);
//注意这个Sleep一定要放到Lock锁外面,在Lock是不会释放线程的
}
}
DWORD
WINAPI FunctionDeduct(
PVOID
arg)
//减法函数
{
while
(1)
{
MyCriticalSection.Lock();
num--;
printf
(
"执行了num--:%d\n"
,num);
MyCriticalSection.Unlock();
Sleep(100);
}
}
说明FunctionAdd,FunctionDeduct都被得到了执行。如果我们把上面代码中的MyCriticalSection.Unlock();注释掉,则会出现全部是num++这种情况。调试跟踪发现不Unlock解锁则一直在FunctionAdd线程里面执行。这也是为什么Sleep()一定要放到Unlock()外面的原因。Lock()会占着线程不放,直到Unlock()
转载请注明http://www.duguxue.com/?p=317
- C++线程同步 CCRITICALSECTION(临界区类)附自己写的测试代码
- 线程同步 CCriticalSection(临界区类)
- 线程同步 CCriticalSection(临界区类)
- 多线程编程5 线程同步_临界区(CCriticalSection)
- CCriticalSection临界区的使用方法
- 使用MFC的CCriticalSection类来实现操作临界区
- C++【线程同步】-临界区同步
- CCriticalSection临界区
- [MFC]同步对象——CCriticalSection临界区,CSemaphore信号量
- 使用CCriticalSection 类进行线程同步
- [c#][测试]自己写的混淆代码
- 【语言-C++】多线程通同步 临界区 CCriticalSection 与 CSingleLock
- 线程同步-临界区
- 线程同步-临界区
- 临界段CCriticalSection的使用
- 临界段CCriticalSection的使用
- 临界段CCriticalSection的使用
- 临界段CCriticalSection的使用
- 不使用加减乘除求余操作符求一个数的1/3
- SOCKET SEND函数和RECV函数详解(转)
- TI C2000 compiler download link
- VECTOR 常用用法、存储、遍历访问
- RECV的超时总结
- C++线程同步 CCRITICALSECTION(临界区类)附自己写的测试代码
- C++ SOCKET发送STRUCT结构体
- 云计算——IBM smart Cloud
- StarUML---推荐一款UML工具(很好很强大)
- 在tomcat下部署工程
- LeetCode题解:Merge Sorted Array
- ZOJ 1240: IBM Minus One
- ZOJ 1295: Reverse Text
- LeetCode题解:Subsets I and II