除了在现代POSIX环境中使用外,我还可以使用什么?

我是C的新手,但写了一个小的multithreading应用程序。 我想对线程引入延迟。 我一直在使用’usleep’并且行为是我想要的 – 但它会在C99中产生警告。

函数’usleep’的隐式声明

这只是一个警告,但它困扰我。 我用谷歌搜索了一个答案,但我能找到的只是一个while循环/定时器方法,看起来像是CPU密集型。

编辑:

我的包括:

#include  #include  #include  #include  #include  

我正在调用编译器:

 c99 program.c -Wall -pedantic -W -lpthread 

编辑#2:

我创建了一个包含以下内容的新文件:

 #include  int main(void) { usleep(10); } 

我仍然得到警告。

编辑#3:正如所建议的,我已经更新了问题的文本。

问题是您使用的是标准C99编译器,但您正在尝试访问POSIX扩展。 要公开POSIX扩展,您应该例如将_POSIX_C_SOURCE定义为200809L(对于当前标准)。 例如这个程序:

 #include  int main(void) { struct timespec reqtime; reqtime.tv_sec = 1; reqtime.tv_nsec = 500000000; nanosleep(&reqtime, NULL); } 

将使用以下编译命令正确编译并等待1.5秒(1秒+ 500000000纳秒):

 c99 main.c -D _POSIX_C_SOURCE=200809L 

必须使用适当的值定义_POSIX_C_SOURCE宏,以使POSIX扩展可用。

另外-Wall,-pedantic和-W的选项没有为POSIX c99命令定义,那些看起来更像是gcc命令给我(如果它们在你的系统上运行那么那很好,只要知道它们不能移植到其他POSIX)系统)。

您可能在现代POSIX系统上:

POSIX.1-2008删除了usleep()的规范。

在我的系统(linux)上有一个宏的详细解释,必须设置它才能恢复该function。 但是你应该遵循zvrba已经给出的建议,而是使用nanosleep

从手册页:此function已过时。 请改用nanosleep。

函数’usleep’的隐式声明

此警告通常意味着您没有#include正确的头文件,在本例中为unistd.h

你有#include 吗?

你可以使用一些类似的方法:nanosleep()表示纳秒,sleep()表示秒数。 或者另一种方式可能是使用clock(),但我认为这更浪费CPU。