windows多线程-关键代码段(临界区)
来源:互联网 发布:牛仔淘宝生产商 编辑:程序博客网 时间:2024/05/12 15:16
例1 使用关键代码段(临界区)实现线程同步
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
);
DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
);
int tickets=100;
CRITICAL_SECTION g_cs;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
InitializeCriticalSection(&g_cs);
Sleep(4000);
DeleteCriticalSection(&g_cs);
}
DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
)
{
while(TRUE)
{
EnterCriticalSection(&g_cs);
if(tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else
break;
LeaveCriticalSection(&g_cs);
}
return 0;
}
DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
)
{
while(TRUE)
{
EnterCriticalSection(&g_cs);
if(tickets>0)
{
Sleep(1);
cout<<"thread2 sell ticket : "<<tickets--<<endl;
}
else
break;
LeaveCriticalSection(&g_cs);
}
cout<<"thread2 is running!"<<endl;
return 0;
}
------------------------------
例2 使用关键代码段(临界区)(创建多个临界区对象时)容易产生死锁,比如下面代码:
#include <windows.h>
#include <iostream.h>
DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
);
DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
);
int tickets=100;
CRITICAL_SECTION g_csA;
CRITICAL_SECTION g_csB;
void main()
{
HANDLE hThread1;
HANDLE hThread2;
hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);
hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);
CloseHandle(hThread1);
CloseHandle(hThread2);
InitializeCriticalSection(&g_csA);
InitializeCriticalSection(&g_csB);
Sleep(4000);
DeleteCriticalSection(&g_csA);
DeleteCriticalSection(&g_csB);
}
DWORD WINAPI Fun1Proc(
LPVOID lpParameter // thread data
)
{
while(TRUE)
{
EnterCriticalSection(&g_csA);
Sleep(1);
EnterCriticalSection(&g_csB);
if(tickets>0)
{
Sleep(1);
cout<<"thread1 sell ticket : "<<tickets--<<endl;
}
else
break;
LeaveCriticalSection(&g_csB);
LeaveCriticalSection(&g_csA);
}
return 0;
}
DWORD WINAPI Fun2Proc(
LPVOID lpParameter // thread data
)
{
while(TRUE)
{
EnterCriticalSection(&g_csB);
Sleep(1);
EnterCriticalSection(&g_csA);
if(tickets>0)
{
Sleep(1);
cout<<"thread2 sell ticket : "<<tickets--<<endl;
}
else
break;
LeaveCriticalSection(&g_csA);
LeaveCriticalSection(&g_csB);
}
cout<<"thread2 is running!"<<endl;
return 0;
}
--------------------------
总结--windows线程同步的三种方法的比较(互斥对象、事件对象与关键代码段的比较) :
- windows多线程-关键代码段(临界区)
- windows多线程-关键代码段(临界区)(sunxin vc++ 笔记4)
- Windows多线程程序设计之线程同步分析(结合临界区(关键代码段))
- 关键代码段(临界区)
- 多线程第三篇:关键段(临界区)
- 多线程之关键段(临界区)
- 多线程同步的三种方法-互斥量-事件对象-关键代码段(临界区)
- 多线程编程Demo[关键代码段[临界区]实现线程同步]
- C++多线程编程例子 Demo 关键代码段 临界区 实现线程同步
- C++多线程同步(采用关键代码段即临界区)
- windows核心编程-关键段(临界区)线程同步
- 利用关键代码段(临界区)实现线程同步
- 关键代码段(临界区)实现线程死锁
- 秒杀多线程第五篇 经典线程同步 关键段(临界区,CriticalSection)
- 秒杀多线程第五篇---经典线程同步 关键段(临界区)CS
- 临界段临界区
- 白话windows多线程同步之关键段
- Windows多线程(三) 关键段 CS
- 删除已知进程ID的程序的系统托盘中的图标
- 七夕怀念
- 网络工程师路由器配置
- 缓存技术
- IE6报"无法设置selected属性。无效索引。"
- windows多线程-关键代码段(临界区)
- windowsxp登陆过程
- C++中delete和delete[]的区别[转]
- Error in invoking target 'ntcontab.o' of makefile '
- OGRE 3D使用resources_d.cfg加载模型
- KMP算法学习
- 6、怎样从顶部开始逐层打印二叉树
- 关于QMessageBox阻塞进程的处理方法
- C++ Static用法