Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
x86 gcc睡眠块还是旋转?_C_Multithreading_Locking_X86_Sleep - Fatal编程技术网

x86 gcc睡眠块还是旋转?

x86 gcc睡眠块还是旋转?,c,multithreading,locking,x86,sleep,C,Multithreading,Locking,X86,Sleep,我如何制作一个C语言的sleep版本,这样它就可以使用cpu周期了?你需要什么吗 for (; ; ) ; ?您需要的不仅仅是 for (; ; ) ; ?我想类似(伪代码) while(时间

我如何制作一个C语言的sleep版本,这样它就可以使用cpu周期了?

你需要什么吗

for (; ; ) ;

您需要的不仅仅是

for (; ; ) ;

我想类似(伪代码)

while(时间
“time 我想大概是(伪代码)

while(时间
“time 您要做的是循环,直到经过一定的时间。只需获取当前时间(使用可用的最高精度计时器)并循环,直到当前时间是启动后的特定时间量

下面是一个使用Windows API和使用两个相关函数的性能计数器的具体示例,以及

void Sleep\u自旋(DWORD毫秒)
{
大整数频率、目标、电流;
/*获取每秒的计数*/
如果(!QueryPerformanceFrequency(&freq)){/*句柄错误*/}
/*将目标设置为计数的毫秒数*/
target.QuadPart=freq.QuadPart*dw毫秒/1000;
/*获取当前计数*/
如果(!QueryPerformanceCounter(¤t)){/*句柄错误*/}
/*调整目标以获取结束计数*/
target.QuadPart+=当前的.QuadPart;
/*循环,直到计数超过目标*/
做
{
如果(!QueryPerformanceCounter(¤t)){/*句柄错误*/}
}而(current.QuadPart
在您的情况下使用适当的API,不管是什么。

您要做的是循环,直到经过一定的时间。只需获取当前时间(使用可用的最高精度计时器)并循环,直到当前时间是启动后的特定时间量

下面是一个使用Windows API和使用两个相关函数的性能计数器的具体示例,以及

void Sleep\u自旋(DWORD毫秒)
{
大整数频率、目标、电流;
/*获取每秒的计数*/
如果(!QueryPerformanceFrequency(&freq)){/*句柄错误*/}
/*将目标设置为计数的毫秒数*/
target.QuadPart=freq.QuadPart*dw毫秒/1000;
/*获取当前计数*/
如果(!QueryPerformanceCounter(¤t)){/*句柄错误*/}
/*调整目标以获取结束计数*/
target.QuadPart+=当前的.QuadPart;
/*循环,直到计数超过目标*/
做
{
如果(!QueryPerformanceCounter(¤t)){/*句柄错误*/}
}而(current.QuadPart

在您的情况下使用适当的API,不管是什么。

那么您的问题就是如何编写旋转的睡眠函数?是的,我如何使自定义睡眠函数旋转?那么您的问题就是如何编写旋转的睡眠函数?是的,我如何使自定义睡眠函数旋转,是的,它必须在给定的时间后返回。大概,是的,它必须在给定的时间后返回。
void Sleep_spin(DWORD dwMilliseconds)
{
    LARGE_INTEGER freq, target, current;

    /* get the counts per second */
    if (!QueryPerformanceFrequency(&freq)) { /* handle error */ }

    /* set target to dwMilliseconds worth of counts */
    target.QuadPart = freq.QuadPart * dwMilliseconds / 1000;

    /* get the current count */    
    if (!QueryPerformanceCounter(&current)) { /* handle error */ }

    /* adjust target to get the ending count */
    target.QuadPart += current.QuadPart;

    /* loop until the count exceeds the target */
    do
    {
        if (!QueryPerformanceCounter(&current)) { /* handle error */ }
    } while (current.QuadPart < target.QuadPart);
}