线程同步方法一: CRITICAL_SECTION (临界区)

本文介绍如何使用临界区实现线程间的同步操作,包括初始化、进入、离开及销毁临界区的方法。通过两个线程函数示例,展示了线程如何在进入已锁定的临界区时被挂起,直到拥有临界区的线程释放锁。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 使用方法:

 

// 临界区

CRITICAL_SECTION  m_cs;

 

// 线程函数1

ThreadFunction1()

{

       EnterCriticalSection(&m_cs);

       // do something

       LeaveCriticalSection(&m_cs);

}

 

// 线程函数1

ThreadFunction2()

{

       EnterCriticalSection(&m_cs);

/ do something

       LeaveCriticalSection(&m_cs);

}

 

// 简单说明

在ThreadFunction1()中, 在调用了EnterCriticalSection(&m_cs), 而在调用LeaveCriticalSection(&m_cs)前,假设ThreadFunction2()调用到EnterCriticalSection(&m_cs), 此时hreadFunction2()发现了有别的地方已经EnterCriticalSection(&m_cs)了, 就会挂起, 知道ThreadFunction1()调用了LeaveCriticalSection(&m_cs);后, 线程ThreadFunction2()才被唤醒。

 

 

// 相关函数

//初始化临界区, 可以在线程创建函数中执行 参数是out, 相当于创建临界区
InitializeCriticalSection (&csMyCriticalSection);

//进入临界区
EnterCriticalSection (& m_cs);

//退出临界区
LeaveCriticalSection (& m_cs);

//删除临界区
DeleteCriticalSection(& m_cs);

 

 

// 引用:

http://blog.youkuaiyun.com/hbyh/archive/2007/08/30/1765953.aspx


The InitializeCriticalSectionAndSpinCount function initializes a critical section object and sets the spin count for the critical section.

BOOL InitializeCriticalSectionAndSpinCount(
  LPCRITICAL_SECTION lpCriticalSection,
                      // pointer to critical section
  DWORD dwSpinCount   // spin count for critical section
);

SetCriticalSectionSpinCount

The SetCriticalSectionSpinCount function sets the spin count for the specified critical section.

DWORD SetCriticalSectionSpinCount(
  LPCRITICAL_SECTION lpCriticalSection, 
                      // pointer to critical section
  DWORD dwSpinCount   // spin count for critical section
);
当线程试图进入另一个线程拥有的关键代码段时,调用线程就立即被置于等待状态。这意
味着该线程必须从用户方式转入内核方式(大约1 0 0 0个C P U周期)。这种转换是要付出很大代价的。因此, InitializeCriticalSectionAndSpinCount 的作用不同于InitializeCriticalSection 之处就在于设置了一个循环锁,不至于使线程立刻被置于等待状态而耗费大量的CPU周期,而在dwSpinCount后才转为内核方式进入等待状态。通常
dwSpinCount设为4000较为合适 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值