线程同步方法
来源:互联网 发布:梦幻西游网络出错 编辑:程序博客网 时间:2024/04/20 20:42
线程同步方法
临界区 -> CCriticalSection //Critical 鉴定的;临界的;批评的;爱挑剔的; 临界区对象是应用程序对象,以下三个都是Windows的内核对象,所以使用临 界区对象相对来说要快点 互斥量 -> CMutex //mutex 互斥,互斥量 信号量 -> CSemaphore //Semaphore 信号量 事件 -> CEvent 以上四个类都是封装好的c++的类,可以直接使用 1:首先介绍临界区,以上次做到线程同步为例,
先定义一个临界区指针,然后在构造函数里创建一个新对象,析构函数里释放对象,析构函数需要在.h文件里声明
然后在共享资源区分别进行加锁解锁就可以了
加锁后该区域的代码就不能并发执行了,这里如果正在执行线程A的代码,此时如果点击按钮2,不会像之前没有加锁一样会出现错误的结果,而是线程B等待线程A执行完毕后再执行,所以这样虽然速度慢点,但是保证了结果是正确的,第一中线程同步方法就是这么简单
2:互斥量
和方法一 一样, 定义一个CMutex指针,在构造函数里创建一个对象,析构函数里释放,使用互斥量最简单的方法是使用CSingleLock;
CSingleLock singleLock(g_pMutex); for(int i=1;i<=100000000;i++) { //加锁 signleLock->Lock();//有可能没锁住,要判断一下 if(singleLock.IsLocked()) { k=k*2; k=k/2; total+=k; //解锁 singleLock.Unlock(); } }
3: 信号量
注意信号量初始化时:
g_pSemaphore = new CSemaphore(1,1);
信号量对象是很复杂的,可以做复杂的线程同步,这里的例子比较简单,只用将这两个参数设为1就可以了
CSingleLock singleLock(g_pSemaphore); for(int i=1;i<=100000000;i++) { //加锁 signleLock->Lock();//有可能没锁住,要判断一下 if(singleLock.IsLocked()) { k=k*2; k=k/2; total+=k; //解锁 singleLock.Unlock(); } }
4:事件
初始化时:
g_pEvent=new CEvent(TRUE); //初始时有信号,有信号就可以进行加锁
然后就可以使用信号对象进行同步了
CSingleLock singleLock(g_pSemaphore); for(int i=1;i<=100000000;i++) { //加锁 signleLock->Lock();//有可能没锁住,要判断一下 if(singleLock.IsLocked()) { k=k*2; k=k/2; total+=k; //解锁 singleLock.Unlock(); //事件对象不同,还要加上SetEvent g_pEvent->SetEvent(); //告诉其他线程,现在可以加锁了 } }
0 0
- 线程同步---同步方法
- 线程的同步-同步方法
- 线程同步的方法
- Windows线程同步方法
- 线程同步的方法
- 线程同步方法
- 线程同步的方法
- VC线程同步方法
- 线程同步的方法
- 线程同步方法
- VC线程同步方法
- windows线程同步方法
- 线程同步的方法
- 线程同步方法
- .NET 线程同步方法
- 线程同步方法
- 线程同步的方法
- python线程同步方法
- JavaScript求非空子集数目
- opencv2—(2)存取像素值
- NYOJ 62 笨小熊
- 7.5 Python 安装第三方库
- WIN10圆形进度条
- 线程同步方法
- Linux文件管理之创建、删除、切换、权限
- 监听器综合案例
- C#小项目:模拟超市收银系统
- Oracle Sales cloud -Configuring Sales Organization(配置销售组织)
- MFC界面换肤美化
- C++--异常处理遇上运算符重载
- C++ Primer课后练习10.29-10.33
- UIButton和UIImageView 区别