手动重置事件+临界区实现线程间的同步
来源:互联网 发布:上海绿地楼盘知乎 编辑:程序博客网 时间:2024/05/12 14:08
临界区:只能实现子进程之间的同步,即控制子进程之间访问资源的互斥性,无法实现父线程和子线程之间的同步
事件:不仅可以实现子进程之间的同步,也可以实现父子进程之间的同步
示例一:使用手动重置事件实现父子进程之间的同步,使用临界区实现子进程之间的同步(即互斥)
该示例要同步两种数据,一种是全局资源g_count,另一种是父子线程之间的传递数据i,前者有事件完成,后者有临界区完成
#include <iostream>#include <Windows.h>using namespace std;int g_count = 0;// 全局资源(由临界区控制子线程对该资源的访问)HANDLE hEvent = NULL;CRITICAL_SECTION g_cs;DWORD WINAPI ThreadProc(PVOID pParam){int nThreadNum = *(int *)pParam;SetEvent(hEvent);// 使事件处于触发状态,此时父线程会被唤醒并准备执行// 注意Sleep的作用:让当前子线程等待一会,使cpu切换到主线程执行Sleep(50);EnterCriticalSection(&g_cs);++g_count;cout << "线程编号为" << nThreadNum << " 全局资源为" << g_count << endl;LeaveCriticalSection(&g_cs);return 0;}int main(int argc, char *argv[]){hEvent = CreateEvent(0,TRUE,FALSE,0);InitializeCriticalSection(&g_cs);HANDLE hThreads[10];for (int i = 0 ; i < 10 ; ++i){// i用来标示每一个子线程,i由父线程传递给子线程,因此要控制父子线程之间i的同步(由事件内核对象控制),否则同一个i值可能标示多个子线程hThreads[i] = CreateThread(0,0,ThreadProc,&i,0,0);WaitForSingleObject(hEvent,INFINITE);// 等待hEvent被触发,此时主线程处于等待状态,刚创建的子线程会被唤醒执行ResetEvent(hEvent);// 将事件设置为未触发状态}// 等待所有线程执行完毕后返回WaitForMultipleObjects(10,hThreads,TRUE,INFINITE);for (int i = 0 ; i < 10 ; ++i){CloseHandle(hThreads[i]);}DeleteCriticalSection(&g_cs);CloseHandle(hEvent);return 0;}
0 0
- 手动重置事件+临界区实现线程间的同步
- 自动重置事件+临界区实现线程间同步
- 信号量+临界区实现线程间的同步
- (转)临界区,互斥量,信号量,事件的区别(线程同步)
- (转)临界区,互斥量,信号量,事件的区别(线程同步)
- 临界区,互斥量,信号量,事件的区别(线程同步)
- 临界区,互斥量,信号量,事件的区别(线程同步)
- 临界区,互斥量,信号量,事件的区别(线程同步) 收藏
- 临界区,互斥量,信号量,事件的区别(线程同步)
- (转)临界区,互斥量,信号量,事件的区别(线程同步)
- (转)临界区,互斥量,信号量,事件的区别(线程同步)
- (转)临界区,互斥量,信号量,事件的区别(线程同步)
- 临界区,互斥量,信号量,事件的区别(线程同步)
- 临界区,互斥量,信号量,事件的区别(线程同步)
- 线程同步的三种方法(互斥,事件,临界区) 之一 使用临界区对象
- 控制台下实现简单的线程同步--临界区
- 同步事件,信号量,互斥,临界区,线程,线程池C++实现(win32,linux)
- 临界区实现线程同步互斥
- <style name="Base.Widget.AppCompat.ActionButton" parent="android:Widget.Material.Acti
- 消除回溯很好的例子
- ios开发学习笔记(这里一定有你想要的东西,全部免费)
- hadoop学习笔记4 在学习笔记3基础上增加案例测试
- Android NDK学习笔记(不用cygwin)
- 手动重置事件+临界区实现线程间的同步
- “赛码杯“题解(hdu 5214 ,5223)
- 提交项目支持64位
- 消除左递归
- apk反编译
- Android中某个类继承PopupWindow,此类跳转到一个Activity中
- Android Studio开发JNI工程
- 浅谈JAVA设计模式之——代理模式(proxy)
- vs编译器选项