我对C很新,但写了一个小的多线程应用程序。我想对线程引入延迟。我一直在使用'usleep'而且行为是我想要的 - 但它会在C99中产生警告。
隐式声明函数'usleep'
这只是一个警告,但它困扰我。我用谷歌搜索了一个答案,但我能找到的只是一个while循环/定时器方法,看起来像是CPU密集型。
编辑:
我的包括:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>
#include <time.h>
我正在调用编译器:
c99 program.c -Wall -pedantic -W -lpthread
编辑#2:
我创建了一个包含以下内容的新文件:
#include <unistd.h>
int main(void) {
usleep(10);
}
我仍然收到警告。
编辑#3:编辑#3: 正如所建议的那样,我已经更新了问题的内容。答案 0 :(得分:5)
问题是您使用的是标准C99编译器,但是您正在尝试访问POSIX扩展。要公开POSIX扩展,您应该例如将_POSIX_C_SOURCE定义为200809L(对于当前标准)。例如这个程序:
#include <time.h>
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扩展可用。
还没有为POSIX c99命令定义选项-Wall,-pedantic和-W,那些看起来更像是gcc命令给我(如果它们在你的系统上运行那么那很好,只要知道它们不是便携式的到其他POSIX系统)。
答案 1 :(得分:4)
您可能正在使用现代POSIX系统:
POSIX.1-2008删除了usleep()的规范。
在我的系统(linux)上,有一个宏的详细解释,必须设置它才能恢复该功能。但是你应该遵循zvrba已经给出的建议,改为使用nanosleep
。
答案 2 :(得分:1)
从手册页:此功能已过时。请改用nanosleep。
答案 3 :(得分:0)
隐式声明函数'usleep'
此警告通常表示您没有#include
正确的头文件,在本例中为unistd.h
。
答案 4 :(得分:0)
你有#include <unistd.h>
吗?
你可以使用一些类似的方法:nanosleep()表示纳秒,sleep()表示秒数。或者另一种方式可能是使用clock(),但我认为这更浪费CPU。