精华内容
下载资源
问答
  • 关键Critical Section

    2013-04-13 11:09:46
    关键CRITICAL_SECTION一共就四个函数,使用很是方便。下面是这四个函数的原型和使用说明。   函数功能:初始化 函数原型: void InitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection); ...

    本文首先介绍下如何使用关键段,然后再深层次的分析下关键段的实现机制与原理。

    关键段CRITICAL_SECTION一共就四个函数,使用很是方便。下面是这四个函数的原型和使用说明。

     

    函数功能:初始化

    函数原型:

    void InitializeCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);

    函数说明:定义关键段变量后必须先初始化。

     

    函数功能:销毁

    函数原型:

    void DeleteCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);

    函数说明:用完之后记得销毁。

     

    函数功能:进入关键区域

    函数原型:

    void EnterCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);

    函数说明:系统保证各线程互斥的进入关键区域。

     

    函数功能:离开关关键区域

    函数原型:

    void LeaveCriticalSection(LPCRITICAL_SECTIONlpCriticalSection);

     

    然后在经典多线程问题中设置二个关键区域。一个是主线程在递增子线程序号时,另一个是各子线程互斥的访问输出全局资源时。详见代码:

    1. #include <stdio.h>  
    2. #include <process.h>  
    3. #include <windows.h>  
    4. long g_nNum;  
    5. unsigned int __stdcall Fun(void *pPM);  
    6. const int THREAD_NUM = 10;  
    7. //关键段变量声明  
    8. CRITICAL_SECTION  g_csThreadParameter, g_csThreadCode;  
    9. int main()  
    10. {  
    11.     printf("     经典线程同步 关键段\n");  
    12.     printf(" -- by MoreWindows( http://blog.csdn.net/MoreWindows ) --\n\n");  
    13.   
    14.     //关键段初始化  
    15.     InitializeCriticalSection(&g_csThreadParameter);  
    16.     InitializeCriticalSection(&g_csThreadCode);  
    17.       
    18.     HANDLE  handle[THREAD_NUM];   
    19.     g_nNum = 0;   
    20.     int i = 0;  
    21.     while (i < THREAD_NUM)   
    22.     {  
    23.         EnterCriticalSection(&g_csThreadParameter);//进入子线程序号关键区域  
    24.         handle[i] = (HANDLE)_beginthreadex(NULL, 0, Fun, &i, 0, NULL);  
    25.         ++i;  
    26.     }  
    27.     WaitForMultipleObjects(THREAD_NUM, handle, TRUE, INFINITE);  
    28.   
    29.     DeleteCriticalSection(&g_csThreadCode);  
    30.     DeleteCriticalSection(&g_csThreadParameter);  
    31.     return 0;  
    32. }  
    33. unsigned int __stdcall Fun(void *pPM)  
    34. {  
    35.     int nThreadNum = *(int *)pPM;   
    36.     LeaveCriticalSection(&g_csThreadParameter);//离开子线程序号关键区域  
    37.   
    38.     Sleep(50);//some work should to do  
    39.   
    40.     EnterCriticalSection(&g_csThreadCode);//进入各子线程互斥区域  
    41.     g_nNum++;  
    42.     Sleep(0);//some work should to do  
    43.     printf("线程编号为%d  全局资源值为%d\n", nThreadNum, g_nNum);  
    44.     LeaveCriticalSection(&g_csThreadCode);//离开各子线程互斥区域  
    45.     return 0;  
    46. }  

    运行结果如下图:

    可以看出来,各子线程已经可以互斥的访问与输出全局资源了,但主线程与子线程之间的同步还是有点问题。

           这是为什么了?

    要解开这个迷,最直接的方法就是先在程序中加上断点来查看程序的运行流程。断点处置示意如下:

    然后按F5进行调试,正常来说这两个断点应该是依次轮流执行,但实际调试时却发现不是如此,主线程可以多次通过第一个断点即

           EnterCriticalSection(&g_csThreadParameter);//进入子线程序号关键区域

    这一语句。这说明主线程能多次进入这个关键区域!找到主线程和子线程没能同步的原因后,下面就来分析下原因的原因吧^_^

     

    先找到关键段CRITICAL_SECTION的定义吧,WinBase.h中被定义成RTL_CRITICAL_SECTION。而RTL_CRITICAL_SECTIONWinNT.h中声明,它其实是个结构体

    typedef struct _RTL_CRITICAL_SECTION {

        PRTL_CRITICAL_SECTION_DEBUGDebugInfo;

        LONGLockCount;

        LONGRecursionCount;

        HANDLEOwningThread; // from the thread's ClientId->UniqueThread

        HANDLELockSemaphore;

        DWORDSpinCount;

    RTL_CRITICAL_SECTION, *PRTL_CRITICAL_SECTION;

    各个参数的解释如下:

    第一个参数:PRTL_CRITICAL_SECTION_DEBUGDebugInfo;

    调试用的。

     

    第二个参数:LONGLockCount;

    初始化为-1n表示有n个线程在等待。

     

    第三个参数:LONGRecursionCount;  

    表示该关键段的拥有线程对此资源获得关键段次数,初为0

     

    第四个参数:HANDLEOwningThread;  

    即拥有该关键段的线程句柄,微软对其注释为——from the thread's ClientId->UniqueThread

     

    第五个参数:HANDLELockSemaphore;

    实际上是一个自复位事件。

     

    第六个参数:DWORDSpinCount;    

    旋转锁的设置,单CPU下忽略

     

    由这个结构可以知道关键段会记录拥有该关键段的线程句柄即关键段是有“线程所有权”概念的。事实上它会用第四个参数OwningThread来记录获准进入关键区域的线程句柄,如果这个线程再次进入,EnterCriticalSection()会更新第三个参数RecursionCount以记录该线程进入的次数并立即返回让该线程进入。其它线程调用EnterCriticalSection()则会被切换到等待状态,一旦拥有线程所有权的线程调用LeaveCriticalSection()使其进入的次数为0时,系统会自动更新关键段并将等待中的线程换回可调度状态。

    因此可以将关键段比作旅馆的房卡,调用EnterCriticalSection()即申请房卡,得到房卡后自己当然是可以多次进出房间的,在你调用LeaveCriticalSection()交出房卡之前,别人自然是无法进入该房间。

    回到这个经典线程同步问题上,主线程正是由于拥有“线程所有权”即房卡,所以它可以重复进入关键代码区域从而导致子线程在接收参数之前主线程就已经修改了这个参数。所以关键段可以用于线程间的互斥,但不可以用于同步。

     

    另外,由于将线程切换到等待状态的开销较大,因此为了提高关键段的性能,Microsoft将旋转锁合并到关键段中,这样EnterCriticalSection()会先用一个旋转锁不断循环,尝试一段时间才会将线程切换到等待状态。下面是配合了旋转锁的关键段初始化函数

    函数功能:初始化关键段并设置旋转次数

    函数原型:

    BOOLInitializeCriticalSectionAndSpinCount(

      LPCRITICAL_SECTIONlpCriticalSection,

      DWORDdwSpinCount);

    函数说明:旋转次数一般设置为4000

     

    函数功能:修改关键段的旋转次数

    函数原型:

    DWORDSetCriticalSectionSpinCount(

      LPCRITICAL_SECTIONlpCriticalSection,

      DWORDdwSpinCount);

     

    Windows核心编程》第五版的第八章推荐在使用关键段的时候同时使用旋转锁,这样有助于提高性能。值得注意的是如果主机只有一个处理器,那么设置旋转锁是无效的。无法进入关键区域的线程总会被系统将其切换到等待状态。

     

     

    最后总结下关键段:

    1.关键段共初始化化、销毁、进入和离开关键区域四个函数。

    2.关键段可以解决线程的互斥问题,但因为具有“线程所有权”,所以无法解决同步问题。

    3.推荐关键段与旋转锁配合使用。


    http://blog.csdn.net/morewindows/article/details/7445233

    展开全文
  • const critical = require('critical'); critical.generate({ inline: true, base: 'D:/love.github.io/AmJson/md5/', src: 'md5.html', target: { html: 'index-critical.html', css: 'critical.css', }, ...

    写在最前

    默认情况下,要打开一个页面,浏览器必须下载、解析和处理所有的外部样式表,然后才能在用户屏幕上显示或呈现内容。这样就必须从网络下载每个外部样式表,这些额外的网络行程会大大增加用户在屏幕上看到任何内容之前必须等待的时间。
    但是实际情况却是,一个比较大的样式表,往往关键css只占很小的一部分。 这篇文章就会介绍如何利用critical提取一个页面上的关键css以及推迟非关键css

    1. 首先要安装node.js ,这里就不说说明了 很简单

    2. 打开cmd命令, 输入命令 npm i -D critical 进行安装,安装完成以后,会在你目录 C:\Users\{UserName}\AppData\Roaming\npm\node_modules 创建一个critical文件夹。 {UserName}是你计算机的用户名

      AppData可能是隐藏的目录

    3. C:\Users\{UserName}\AppData\Roaming\npm\node_modules\critical目录下新建pcs.js文件,文件名自定义,文件内容如下:
      base是你的根目录
      src是你项目的html文件
      target下面的html是处理后的html文件,css是处理后css文件

      const critical = require('critical');
      critical.generate({
        inline: true,
        base: 'D:/love.github.io/AmJson/md5/',
        src: 'md5.html',
        target: {
          html: 'index-critical.html',
          css: 'critical.css',
        },
        width: 1300,
        height: 900,
      });
      
    4. C:\Users\{UserName}\AppData\Roaming\npm\node_modules\critical目录下执行命令node fileName.js,会在你源文件的目录下生成html和css文件

      fileName是你的文件名

    5. 你可以打开index-critical.html这个文件看一下,主体代码都不会动, 他会把关键css直接内联,直接用<style></style>包裹起来,然后把你以前的外部css文件全部延迟加载, 你要做的就是引进critical.css就可以了

    6. 现在再去测试一下你页面的加载速度,你会发现速度确实会快很多,如果你项目本身的css文件比较大,效果会比较显著

    7. 更多的critical知识可以参考github https://github.com/addyosmani/critical/blob/master/README.md

    8. Chrome自带的Coverage也可以很直观的看到哪些是关键css,但是有一个缺点,就是没法导出,只能手动或者写代码处理,后续的文章会介绍

    展开全文
  • Critical Path--关键路径

    2020-09-04 11:18:33
    一般是指我们设计中时序最关键的路径,通常也就是timing最差或者最难修的路径。实际工作中,leader或者同事也经常问你Critical Path在哪里。 这时,我们要学会从时序报告中去找到timing最差的path并去分析它。 那...

    什么是Critical Path? 一般是指我们设计中时序最关键的路径,通常也就是timing最差或者最难修的路径。实际工作中,leader或者同事也经常问你Critical Path在哪里。 这时,我们要学会从时序报告中去找到timing最差的path并去分析它。

    那如何分析呢?下面提供几点建议

    首先,我们可以看下这条path的走向是否合理,也叫作detour,通俗的解释就是有没有绕远路。

    Innovus可以采用Global timing debug工具显示path path的路径

    report_timing -machine_readable > critcal_path.mtarpt

    其次,我们可以看下设计的clock tree做得平不平。 通常来说,我们还是希望clock tree能尽可能做平一点,这样timing更容易meet。简单一点的方法,我们能直接从时序报告中得到clock tree的skew,就是自己算下launch clock path和capture clock path的delay差值(下图箭头差值),如果差值过大,那就要重点看一下clock tree的质量了

    在这里插入图片描述
    最后,我们也可以分析下具体data path上,有没有一些bad buffering, 过大的 load或者transition,甚至一些距离比较长的net都可以研究下

    转载:https://www.sohu.com/a/288660692_99933533

    展开全文
  • Critical Section ObjectsA critical section object provides synchronization similar to that provided by a mutex object, except that a critical section can be used only by the threads of a single proc

    Critical Section Objects

    A critical section object provides synchronization similar to that provided by a mutex object, except that a critical section can be used only by the threads of a single process. Event, mutex, and semaphore objects can also be used in a single-process application, but critical section objects provide a slightly faster, more efficient mechanism for mutual-exclusion synchronization (a processor-specific test and set instruction). Like a mutex object, a critical section object can be owned by only one thread at a time, which makes it useful for protecting a shared resource from simultaneous access. There is no guarantee about the order that threads obtain ownership of the critical section, however, the system is fair to all threads. Unlike a mutex object, there is no way to tell whether a critical section has been abandoned.

     

    使用方法,

     

    1.首先建立一个 Critical Section 对象。用 InitializeCriticalSection(&hCriticalSection);

    2.在需要同步控制的地方 使用  EnterCriticalSection(&hCriticalSection); 进入使用共享资源

    3.在离开需要同步控制的地方 使用 LeaveCriticalSection(&hCriticalSection);

    4.共享资源使用结束。删除Critical Section对象。 DeleteCriticalSection(&hCriticalSection);

    展开全文
  • 关键链(Critical Chain)是由高德拉特(Eli Goldratt)博士提出的一种基于约束理论(Theory of Constraints)的项目管理方法。关键链项目管理基于从约束理论导出的方法和算法。
  • 关键路径: 即决定一项工程的完成时间的路径。 如下图所示,是一辆汽车的生产流程,其中外壳、发动机、轮子等的生产过程都是可以并行进行的,但是发送机生产需要的时间最长,而只有所有零部件生产完成才才能进行下...
  • 线程同步--关键CRITICAL_SECTION

    千次阅读 2016-06-06 16:31:37
    关键CRITICAL_SECTION一共就四个函数,使用很是方便。下面是这四个函数的原型和使用说明。 函数功能:初始化 函数原型: VOID WINAPI InitializeCriticalSection( __out LPCRITICAL_SECTION lpCriticalSection ...
  • windows多线程(四) 关键CriticalSection 一、问题回顾 我们上一篇文章最后的程序的输出 g_Count 的值不是每次都正确,原因是没有对全局资源 g_Count 进行互斥访问(就是同一时刻只能由一个线程访问),接下来...
  • Laravel软件包,用于生成和使用内联关键路径CSS。 为什么? 为了获得最佳性能,您可能需要考虑将关键CSS直接内联到HTML文档中。 这消除了关键路径中的其他往返,并且如果操作正确,可用于传递“一个往返”关键路径...
  • 10关键路径_CriticalPath

    2020-10-07 12:58:04
    } /* 求关键路径,GL为有向网,输出G的各项关键活动 */ void CriticalPath(GraphAdjList GL) { EdgeNode* e; int i, gettop, k, j; int ete, lte; /* 声明活动最早发生时间和最迟发生时间变量 */ Topological...
  • 演示示例这里一个有关键区锁死问题的程序,运行之后依次点击“CS锁死”按钮、右上角退出按钮,程序就会卡死。(图1) 对于眼下的这个问题,界面完全失去响应,这说明负责消息处理的UI线程阻塞了。对于几乎所有的...
  • 关键路径*CriticalPath

    2019-05-26 21:47:00
    #include <cstdio> #include <algorithm> #include <vector> #include <stack> #define INF 0x7FFFFFFF using namespace std; typedef struct Arcnode { int w, adj, E, L;......
  • 关键路径_CriticalPath

    2012-09-03 22:15:27
    /* 求关键路径,GL为有向网,输出G的各项关键活动 */ void CriticalPath(GraphAdjList GL) { EdgeNode *e; int i,gettop,k,j; int ete,lte; /* 声明活动最早发生时间和最迟发生时间变量 */ ...
  • c/c++求解图的关键路径 critical path 上图表示一个工程,工程以V1为起始子工程,V9为终止子工程。 由图可以看出,要开工V5工程,必须在完成工程V2和V3后才可以。 完成V2需要a1(6)个小时,完成V3需要a2(4)个小时...
  • 关键路径问题(Critical Path)——图】

    千次阅读 多人点赞 2020-11-27 23:37:59
    关键路径问题(Critical Path)一、基本术语三级目录二级目录三级目录二级目录三级目录 AOE网(Activity On Edges)------用边表示活动的网络 1、用一个有向图表示一个工程的各子工程及其相互制约的关系,弧表示活动...
  • windows线程同步之关键段(critical section) 关键段(critical section)是一小段代码,在它执行之前需要独占对一些共享资源的访问权。这种方式可以让多行代码以“原子方式”来对资源进行操控。这里的原子方式指...
  • 一个经典的多线程同步问题》提出了一个经典的多线程同步互斥问题,本篇将用关键CRITICAL_SECTION来尝试解决这个问题。 本文首先介绍下如何使用关键段,然后再深层次的分析下关键段的实现机制与原理。 关键...
  • CriticalPath(关键路径)

    千次阅读 2018-11-26 23:12:59
     如果得到的拓朴有序序列中顶点的个数小于网中顶点个数n,则说明网中有环,不能求出关键路径,算法结束。  B、从完成顶点 v n 出发,令vl(n)=ve(n),按逆拓朴有序求其余各顶点的允许的最晚发生时间: vl(j)=...
  • 一、关键段CS 和 互斥量Mutex 的相同点:都有线程拥有权 关键段和互斥量都有线程拥有权,即可以被一个线程拥有。在 前面讲关键段CS的文章中有说到,关键段结构体的第四个参数保存着拥有该关键段的线程的句柄,具体...
  • 大话数据结构code 第七章 10关键路径_CriticalPath
  • Critical:在HTML页面中提取和内联CSS关键路径
  • 条件2:关键路径是最长路径的那条,最长意味着这条路径的最后一个任务的完成时间最长。用来表示完成整个工程至少需要多少时间。 PS:其他例子 【例2】 【例3】 Other XMind简答题和填空题复习笔记、选择题Doc文档:...
  • 1 #include 2 #include ... CriticalPath(GraphAdjList GL) 170 { /* 关键路径 */ 171 EdgeNode * e; 172 int i, gettop, k, j; 173 int ete, lte; // 最早发生和最迟发生的变量...
  • 这里一个有关键区锁死问题的程序,运行之后依次点击“CS锁死”按钮、右上角退出按钮,程序就会卡死。(图1) 对于眼下的这个问题,界面完全失去响应,这说明负责消息处理的UI线程阻塞了。对于几乎所有的windows ...
  • 首先推荐有个b站视频,讲关键路径讲的非常好,20min可搞懂:https://www.bilibili.com/video/BV1PW41187vc?from=search&seid=40093726432206649 ...找到图的关键路径属于项目管理的范围,应由项目经理严格

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 960
精华内容 384
关键字:

关键critical