临界段——win32 API函数

转载 2011年01月18日 16:02:00

临界段——win32 API函数

(2010-05-30 10:52:25)

一、有关函数:

   InitializeCriticalSection()    创建一个临界段

   DeleteCriticalSection()        释放一个临界段

   EnterCriticalSection()         获取对临界段的所有权,独占共享资源

   TryEnterCriticalSection()      试图获得对临界段的所有权,但不阻塞

   LeaveCriticalSection()         释放对资源的所有权

 

二、举例

1,

#include<windows.h>
#include<process.h>
#include<stdio.h>
CRITICAL_SECTION cs;
int a[5];
void Thread(void* pParams)
{
 int i,num=0;
 while(1)
 {
  EnterCriticalSection(&cs);//试图获得临界段对象
  for(i=0;i<5;i++)
  a[i]=num;
  num++;
  LeaveCriticalSection(&cs);//释放对临界段对象的所有权
 }
}
int main(void)
{
 InitializeCriticalSection(&cs);//初始化临界段对象
 _beginthread(Thread,0,NULL);
 while(1)
 {
  EnterCriticalSection(&cs);
  printf("%d %d %d %d %d/n",a[0],a[1],a[2],a[3],a[4]);
  LeaveCriticalSection(&cs);
 }
 return 0;
}

以上黑色部分是没利用临界段的,可想而知,结果是无法预知的。加了红色部分之后,就可以有规律的输出了,因为赋值和输出的顺序得到了妥善安排,而不会乱占乱用。

临界段,就犹如领导,若没得到领导的允许,就不允许行动;若领导禁止了,就必须停止行动。

 

2、关于银行中客户获取ID 问题

#include<windows.h>
#include<process.h>
#include<iostream.h>
CRITICAL_SECTION cs;
unsigned int currentID=1;

unsigned long _stdcall MyThread(LPVOID pParam)
{
 int id;
 EnterCriticalSection(&cs);
 id = currentID;
 Sleep(0);//将本时间片的NGCHU剩余时间让出。为了把不同步效果明显表现出来,现实中不用Sleep
 currentID++;
 LeaveCriticalSection(&cs);
 cout<<"My Idntifier is:"<<id<<endl;
 return id;
}
int main(int argc,char *argv[])
{
 HANDLE handle;
 DWORD dw;//保存新线程的id
 InitializeCriticalSection(&cs);
 for(int i=0;i<100;i++)
 {
  handle = CreateThread(NULL,0,MyThread,NULL,0,&dw);
  CloseHandle(handle);
 }
 Sleep(6000);
 return 0;
}

以上,若没有加上红色部分,输出会十分混乱,导致很多人都拥有了相同的ID号。加上了之后,就能够有条不紊的按照获得的ID号进行输出。

 

三、比较:

第一个例子是创建了一个线程,然后让其自行运行,只要把输入输出按顺序就行。

第二个例子是按照每次需要,每次都创建线程,可以人工控制输入输出,然后也依然是按顺序来。

另外:

我们发现上面用了两个不一样的创建线程的函数:_beginthread 和 CreateThread

1、_beginthread是c++的函数 ,CreateThread是windows API函数

2、_beginthread只是简单的去执行线程,而CreateThread是通过句柄去执行线程,执行结束要要记得关闭句柄

重温WIN32 API ------ 最简单的Windows窗口封装类

如果你也厌倦了复杂的MFC,这里提供了一个非常简单的把C++类、对象与窗口类、对象联系起来的方式。...
  • smstong
  • smstong
  • 2015年01月04日 17:14
  • 11390

C++ 之CRITICAL_SECTION 关键段 OR 临界区联系(六)

摘要 临界区是一种防止多个线程同时执行一个特定代码节的机制,这一主题并没有引起太多关注,因而人们未能对其深刻理解。在需要跟踪代码中的多线程处理的性能时,对 Windows 中临界区的深刻理解非常...
  • u010236550
  • u010236550
  • 2013年10月14日 16:46
  • 1521

[Win32SDK基本] 窗口详解(超详细)

Win32SDK创建窗口,虽然早已经烂大街了,但是那些资料太散,都不全面,无法满足我编程的需要,因此,有必要整理一下。 这篇文章包括一下几个部分: 1。窗口类详解 2。窗口样式详解 3。窗口显示更新详...
  • zuishikonghuan
  • zuishikonghuan
  • 2015年06月05日 16:20
  • 5587

临界段——win32 API函数

临界段——win32 API函数 (2010-05-30 10:52:25) 转载 标签: api函数 win32 句柄 临界段 线程 it 分类: 多线程...
  • xringm
  • xringm
  • 2016年03月24日 10:43
  • 111

临界段——win32 API函数

一、有关函数:    InitializeCriticalSection()    创建一个临界段    DeleteCriticalSection()        释放一个临界段 ...
  • q472599451
  • q472599451
  • 2013年07月08日 23:33
  • 370

信号量——win32 API函数

信号量——win32 API函数(2010-05-31 17:31:51)转载标签:信号量api函数win32downit分类:多线程编程一、关于信号量1、在信号量中有一个内置的计数值,用于对资源进行...
  • luxiaoyu_sdc
  • luxiaoyu_sdc
  • 2011年01月18日 16:07
  • 3137

信号量——win32 API函数

一、关于信号量 1、在信号量中有一个内置的计数值,用于对资源进行计数;同时它通过内置的互斥机制保证在有多个线程试图对计数值进行修改时,在任一时刻只有一个线程对计数值进行修改。 2、信号量的两个核心...
  • xringm
  • xringm
  • 2016年03月24日 10:46
  • 259

Win32 API消息函数:SendMessage(发送消息)

Win32 API消息函数:SendMessage(发送消息) 函数功能: 该函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程 序处理完消息再返回。...
  • u011392772
  • u011392772
  • 2016年08月18日 22:35
  • 4253

C#调用win32API画图函数示例

SelectObject和DeleteObject 函数 Windows显示设备的属性,共有下面几种:位图、画刷、字体、画笔、区域。如果要设置它们到当前设备里,就需要使用SelectObject...
  • jiangxinyu
  • jiangxinyu
  • 2012年10月22日 14:29
  • 6676

C#中对应win32 API原型函数的一些数据类型

BOOL=System.Int32 BOOLEAN=System.Int32 BYTE=System.UInt16 CHAR=System.Int16 COLORREF=System.UInt...
  • qq283868910
  • qq283868910
  • 2011年12月05日 22:00
  • 693
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:临界段——win32 API函数
举报原因:
原因补充:

(最多只允许输入30个字)