如下情况:
例如 我有一个 函数A,需要运行差不多 1、2s 时间。
那么它在运行过程中,肯定会被分割成好多个 时间片 来跑,那我能不能有啥方法得知这个函数运行过程中经历了几个时间片????
比如我有一个全局变量 int i ,在 函数A 开始的时候 i=0 ,在 函数A 经历 线程切换的时候,i++ ,这样在 函数A 跑完的时候 我查看 i 就知道经历了几次 线程切换了。能不能实现啊??

解决方案 »

  1.   

    没有办法通过API获取到的,而且这个值也毫无意义吧。倒是有API可以获取线程的实际执行时间就是了。
      

  2.   

    Kthread->ContextSwitchestypedef struct _SYSTEM_THREADS { 
    LARGE_INTEGER KernelTime; 
    LARGE_INTEGER UserTime; 
    LARGE_INTEGER CreateTime; 
    ULONG WaitTime; 
    PVOID StartAddress; 
    CLIENT_ID ClientId; 
    KPRIORITY Priority; 
    KPRIORITY BasePriority; 
    ULONG ContextSwitchCount; 
    THREAD_STATE State; 
    KWAIT_REASON WaitReason; 
    } SYSTEM_THREADS, *PSYSTEM_THREADS; 
      

  3.   

    windows下你是基本上无法知道的,因为不同版本的系统调度算法略微不同,而且线程也分优先级,同等优先级下大概20ms的时间片。线程中有个CONTEXT结构来记录线程的上下文,里面有保存被调度的次数。
      

  4.   

    系统底层的无法通过API访问的
      

  5.   

    可以的,你可以嵌入汇编,直接的到CPU运行时间。    __int64 BegTime = 0;
        __int64 EndTime = 0;
        int a[ 3 ] = { 4, 5, 6 };    __asm
        {
            rdtsc
            mov dword ptr [ BegTime ], eax
            lea eax, dword ptr [ BegTime ]
            mov dword ptr [ eax + 4 ], edx
        }
       
        ADD< 3, int >::Result( a );    __asm
        {
            rdtsc
            mov dword ptr [ EndTime ], eax
            lea eax, dword ptr [ EndTime ]
           mov dword ptr [ eax + 4 ], edx
        }    
        printf("%d___\n",EndTime - BegTime);
     不过比支持多核
      

  6.   

    可以用驱动Hook SwapContext 或者 NtQuerySystemInformation把执行时间和CPU时间片大小拿到然后算一下...
      

  7.   

    process explorer就可以看到线程的切换次数
      

  8.   

    在线程内部用全局变量计数是绝对不可能的。但是线程内核对象里应该有这个计数值,查查sdk吧