C 语言中是否有毫秒级的替代睡眠函数?
- 2024-10-18 09:00:00
- admin 原创
- 84
问题描述:
我有一些在 Windows 上编译的源代码。我正在将其转换为在 Red Hat Linux 上运行。
源代码已经包含了<windows.h>
头文件,程序员已经使用了Sleep()
函数来等待几毫秒的时间。这在Linux上是行不通的。
但是,我可以使用该sleep(seconds)
函数,但它使用以秒为单位的整数。我不想将毫秒转换为秒。是否有其他 sleep 函数可用于 Linux 上的 gcc 编译?
解决方案 1:
是的 - 较旧的POSIX标准已定义usleep()
,因此在 Linux 上可用:
int usleep(useconds_t usec);
描述
usleep() 函数暂停调用线程的执行(至少)usec 微秒。任何系统活动、处理调用所花费的时间或系统计时器的粒度都可能稍微延长休眠时间。
usleep()
需要微秒,因此您必须将输入乘以 1000 才能在几毫秒内休眠。
usleep()
已被弃用并随后从 POSIX 中删除;对于新代码,nanosleep()
首选:
#include <time.h> int nanosleep(const struct timespec *req, struct timespec *rem);
描述
nanosleep()
暂停调用线程的执行,直到至少指定的时间*req
过去,或者传递触发调用线程中的处理程序的调用或终止该过程的信号。结构 timespec 用于指定纳秒精度的时间间隔。其定义如下:
struct timespec { time_t tv_sec; /* seconds */ long tv_nsec; /* nanoseconds */ };
msleep()
使用实现的示例函数nanosleep()
,如果被信号中断则继续睡眠:
#include <time.h>
#include <errno.h>
/* msleep(): Sleep for the requested number of milliseconds. */
int msleep(long msec)
{
struct timespec ts;
int res;
if (msec < 0)
{
errno = EINVAL;
return -1;
}
ts.tv_sec = msec / 1000;
ts.tv_nsec = (msec % 1000) * 1000000;
do {
res = nanosleep(&ts, &ts);
} while (res && errno == EINTR);
return res;
}
解决方案 2:
您可以使用此跨平台功能:
#ifdef WIN32
#include <windows.h>
#elif _POSIX_C_SOURCE >= 199309L
#include <time.h> // for nanosleep
#else
#include <unistd.h> // for usleep
#endif
void sleep_ms(int milliseconds){ // cross-platform sleep function
#ifdef WIN32
Sleep(milliseconds);
#elif _POSIX_C_SOURCE >= 199309L
struct timespec ts;
ts.tv_sec = milliseconds / 1000;
ts.tv_nsec = (milliseconds % 1000) * 1000000;
nanosleep(&ts, NULL);
#else
if (milliseconds >= 1000)
sleep(milliseconds / 1000);
usleep((milliseconds % 1000) * 1000);
#endif
}
解决方案 3:
除了usleep()
,POSIX 2008 中没有定义(尽管它在 POSIX 2004 之前已经定义,并且显然在 Linux 和其他具有 POSIX 合规历史的平台上可用),POSIX 2008 标准定义了nanosleep()
:
nanosleep
- 高分辨率睡眠#include <time.h> int nanosleep(const struct timespec *rqtp, struct timespec *rmtp);
该
nanosleep()
函数将导致当前线程暂停执行,直到rqtp
参数指定的时间间隔过去或向调用线程传递信号,其操作是调用信号捕获函数或终止进程。暂停时间可能比要求的要长,因为参数值被四舍五入为睡眠分辨率的整数倍,或者因为系统安排了其他活动。但是,除了被信号中断的情况外,暂停时间不得小于指定的时间rqtp
,以系统时钟 CLOCK_REALTIME 为单位测量。该功能的使用
nanosleep()
对任何信号的作用或阻塞没有影响。
解决方案 4:
除了usleep之外,使用 NULL 文件描述符集的简单选择将允许您以微秒的精度暂停,并且没有复杂化的风险SIGALRM
。
sigtimedwait 和 sigwaitinfo提供类似的行为。
解决方案 5:
#include <unistd.h>
int usleep(useconds_t useconds); //pass in microseconds
解决方案 6:
这应该在所有系统上工作,因为它使用标准库time.h
。
#include <time.h>
void wait_ms(int milliseconds) // waits for "milliseconds" ms
{
clock_t start_time = clock();
while (clock() < start_time + milliseconds);
}
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件