高级线程同步 临界区

简介:

关键代码段
1.原子操作。
2.临界区
指定一个CRITICAL_SECTION 数据结构g_cs,然后对EnterCriticalSection和LeaveCriticalSection
访问共享资源
当拥有一项可供多个线程访问的资源时,应该创建临界区。类似多个人上厕所。
如果多个不是一道线程使用的资源,比如线程1和线程2访问一个资源,线程1和线程3访问另一个资源。
那么应该为每个资源创建独立的厕所。

缺点无法对多个进程中的各线程进行同步。

初始化:
InitializeCriticalSection(PCRITICAL_SECTION pcs);
删除:
DeleteCriticalSection();
访问/退出
EnterCriticalSection (将一个线程置于等待状体,容易变成渴求CPU时间的线程,设定超时时间)
超时设定 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Session Manager,默认值30天,不要设置太小(小于3s)
LeaveCritcalSection 
每次计数减一,如果计数变为0,查看是否有其他线程等待,如果有,使等待线程中的一个变为可调度状体
。如果没有更新成员变量以指明没有线程访问该资源。
调用线程不进入等待状态
TryEnterCritcalSection

关键代码与循环锁
Bool InitializeCriticalSectionAndSpinCount( PCRITICAL_SECTION pcs, DWORD dwSpinCount);
DWORD SetCrticalSectionSpinCount(PCRITICAL_SECTION pcs, DWORD dwSpinCount);
作为一个知道原则,对进程堆栈访问的关键代码使用循环次数是4000.

非常有用的技巧提示

1.每个共享资源使用一个CRITICAL_SECTION变量。


2.同时访问多个资源。

进入推出顺序不一致容易导致死锁。



本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/4254097.html,如需转载请自行联系原作者

相关文章
|
调度 Windows
Windows多线程——临界区、事件、互斥量、信号量详解加代码
Windows多线程——临界区、事件、互斥量、信号量详解加代码
499 0
临界区线程对象的使用
临界区线程对象的使用
111 0
|
C++ 开发者
临界区线程对象的使用
临界区线程对象的使用代码。
425 0
|
Java
Java 并发/多线程教程(八)-竞态条件和临界区
      本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获。由于个人水平有限,不对之处还望矫正!       竞态条件是在临界区内可能发生的一种特殊情况。
1271 0
|
Java 缓存 数据安全/隐私保护
《Java线程与并发编程实践》—— 2.2 同步临界区的访问
你会看到,同步能够解决之前的线程问题。同步是JVM的一个特性,旨在保证两个或者多个并发的线程不会同时执行同一块临界区,临界区就是必须以串行方式(一次一条线程)访问的一段代码块。
2012 0
|
并行计算
OpenMP 线程同步之临界区
多核/多线程编程中肯定会用到同步互斥操作。除了互斥变量以为,就是临界区。 临界区是指在用一时刻只允许一个线程执行的一段用{...},包围的代码段。 在OpenMP中临界区声明方法如下: #pragma omp critical [(name)] //[]表示名字可选 {     //需要同...
1124 0
|
API Windows
windows api学习笔记-用临界区对象使线程同步
#include #include #include using namespace std; int g_nCount1 = 0; int g_nCount2 = 0; CRITICAL_SECTION g_cs;//临界区 BOOL g_bContinue = TRU...
791 0