我已经发现了另一个问题,即Windows/MingW没有为过时的usleep()提供nanosleep()和setitimer()替代方案.但我的目标是修复cppcheck给我的所有警告,包括usleep()样式警告.
那么,是否有一种解决方法可以在不使用cygwin或安装大量新依赖项/库的情况下以某种方式避免使用Windows上的usleep()?谢谢.
gcc (GCC) 4.6.3
c89
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用usleep
.但是,我一直收到以下警告:
隐式声明函数usleep
我已经包含了unistd.h
头文件.
手册页提到了这个问题.但我不确定我理解它:
usleep():
Since glibc 2.12:
_BSD_SOURCE ||
(_XOPEN_SOURCE >= 500 ||
_XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) &&
!(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700)
Before glibc 2.12:
_BSD_SOURCE || _XOPEN_SOURCE >= 500 || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED
Run Code Online (Sandbox Code Playgroud)
但不确定我对上述内容做了什么?
任何机构都能解释一下我sleep()
和usleep()
PHP 之间有什么区别.
我已经指示使用以下脚本来做长时间拉动的聊天应用程序但是在这个脚本中我使用usleep(25000);
或不使用相同的效果usleep(25000);
page1.php中
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"
type="text/javascript"></script>
<script>
var lpOnComplete = function(response) {
console.log(response);
// do more processing
lpStart();
};
var lpStart = function() {
$.post('page2.php', {}, lpOnComplete, 'json');
};
$(document).ready(lpStart);
</script>
Run Code Online (Sandbox Code Playgroud)
使page2.php
<?php
$time = time();
while((time() - $time) < 30) {
// query memcache, database, etc. for new data
$data = getLatest();
// if we have new data return it
if(!empty($data)) {
echo json_encode($data);
break;
}
usleep(25000);
}
function getLatest() { …
Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用POSIX线程的多线程应用程序.我正在使用线程来做一个定期的工作,为此我使用usleep(3)暂停线程执行.我的问题是如何从主线程取消usleep()计时器,我试过pthread_kill(thread, SIGALRM)
但它具有全局效果,导致主应用程序终止(默认情况下).这是我的伪代码:
void threaded_task(void *ptr) {
initialize();
while(running) {
do_the_work();
usleep(some_interval);
}
clean_up();
release_resources();
}
Run Code Online (Sandbox Code Playgroud)
这里是伪函数,用于从主线程停止(并正常关闭)给定线程:
void stop_thread(pthread_t thread) {
set_running_state(thread, 0); // Actually I use mutex staff
// TODO: Cancel sleep timer so that I will not wait for nothing.
// Wait for task to finish possibly running work and clean up
pthread_join(thread, NULL);
}
Run Code Online (Sandbox Code Playgroud)
实现目标的便捷方式是什么?我是否必须使用条件变量,或者我可以使用sleep()变体吗?
我正在开发用C编写的游戏服务器.我需要开发一个具有特定频率(每秒50次)的循环来执行算法.问题是我无法暂停程序一段精确的时间间隔 - 20000微秒.函数usleep(20000)
运行大约30000微秒.结果总是比预期的10000微秒更多.
这是我的简单代码示例:
#include <stdio.h>
#include <time.h>
#include <unistd.h>
int main( int argc, char ** argv )
{
const unsigned long long nano = 1000000000;
unsigned long long t1, t2;
struct timespec tm;
for(;;)
{
clock_gettime( CLOCK_REALTIME, &tm );
t1 = tm.tv_nsec + tm.tv_sec * nano;
usleep( 20000 );
clock_gettime( CLOCK_REALTIME, &tm );
t2 = tm.tv_nsec + tm.tv_sec * nano;
printf( "delay: %ld\n", ( t2 - t1 ) / 1000 );
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它运行的结果是:
$ …
Run Code Online (Sandbox Code Playgroud) usleep的文档说明调用usleep(0)
没有效果.但是,在我的系统(RHEL 5.2)上运行下面的C++代码小片段时,我发现它实际上看起来效果与之相同usleep(1)
.这是预期的,如果是这样的话,为什么文档与我在现实生活中看到的内容之间存在差异?
图表A.
码:
#include <unistd.h>
int main()
{
for( int i = 0; i < 10000; i++ )
{
usleep(1);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
$ time ./test
real 0m10.124s
user 0m0.001s
sys 0m0.000s
Run Code Online (Sandbox Code Playgroud)
图表B
码:
#include <unistd.h>
int main()
{
for( int i = 0; i < 10000; i++ )
{
usleep(1);
usleep(0);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
$ time ./test
real 0m20.770s
user 0m0.002s
sys 0m0.001s
Run Code Online (Sandbox Code Playgroud) 我想usleep()
在CUDA内核中调用类似的东西.基本目标是使所有GPU核心休眠或忙碌数小时 - 这是我想为CUDA应用程序做的一些健全性检查的一部分.我这样做的尝试如下:
#include <unistd.h>
#include <stdio.h>
#include <cuda.h>
#include <sys/time.h>
__global__ void gpu_uSleep(useconds_t wait_time_in_ms)
{
usleep(wait_time_in_ms);
}
int main(void)
{
//input parameters -- arbitrary
// TODO: set these exactly for full occupancy
int m = 16;
int n = 16;
int block1D = 16;
dim3 block(block1D, block1D);
dim3 grid(m/block1D, n/block1D);
useconds_t wait_time_in_ms = 1000;
//execute the kernel
gpu_uSleep<<< grid, block >>>(wait_time_in_ms);
cudaDeviceSynchronize();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我尝试使用NVCC编译时出现以下错误:
error: calling a host function("usleep") from a __device__/__global__
function("gpu_uSleep") is not …
Run Code Online (Sandbox Code Playgroud) 所以我一直在寻找东西,usleep()
而我发现摆脱的一切就是#define
我所做的……还有其他建议吗?我需要摆脱此警告...或者关于如何在毫秒内使用睡眠的任何想法。
#define _BSB_SOURCE
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <unistd.h>
#include <time.h>
int r = rand() % 1000 +1;
usleep(r*1000);
pthread_mutex_lock (&count_mutex);
Run Code Online (Sandbox Code Playgroud) 我正在阅读应用程序代码,引起了我的注意.代码是:usleep(6*1000*1000)
.我知道他们使用这种格式来解决可读性问题.
我认为无论是sleep
和usleep
使用nanosleep
功能,所以我的问题是:为什么不使用的睡眠(6)不完全一样的东西(如:睡眠时间为6秒)?我们使用时是否获得了性能usleep
?是usleep
更"通用"?