C语言 Printf 保存保持连接计时器



>我有一个服务器程序,为每个新创建的客户端生成保持连接线程。我已经使用 clock(( 实现了保持连接机制。如果只有一个客户端连接到服务器,则一切正常。

当我尝试将多个客户端连接到服务器(不完全是 CONNECT,其 UDP(时,就会出现问题。就在第二个客户端连接到服务器之后,两个客户端/其中一个客户端都会无缘无故超时,即。在实际超时之前。

由于有多个客户端,我将更新的时钟时间(每当服务器从客户端接收到激活数据包时更新(推送到映射(每个客户端一个条目(。同样在计时器逻辑中,我需要每次从地图中获取更新的时钟时间。为了调试它,我在计时器逻辑中添加了一个 printf。唉!令我惊讶的是,这个printf一切都很好!我不知道为什么。任何帮助,不胜感激。谢谢。

....
....
pthread_t thread_id[100];
int thread_no =0;
..
//thread listening for commands from client
while(1)
{
..
if(strcmp(cmd_cli, "1") == 0)
{
..
//this is how I spawn keepalive threads
pthread_create(&thread_id[thread_no], NULL, timer_fun, mac_addr);
thread_no++;    
..
}
..
else if(strcmp(cmd_cli, "13") == 0)
{
// Kepalive received from client
if(this_client.state >= RUN)
{
//update timer
this_client.start = clock();
insert(t, mac_addr, this_client);
...
..
}
....
....
//keepalive thread handler on server
struct client_params details = lookup(t, mac);
details.start = clock();    
insert(t, mac, details);
int sec=0, delay=8;
do
{ 
struct client_params details = lookup(t, mac);
clock_t difference = clock() - details.start;
sec = difference / CLOCKS_PER_SEC; 
// following printf saves the timer
printf("sec = %dn", sec);
}while ( sec < delay );
details.state = TIMEOUT;
insert(t, mac, details);
....
....
....

可能是因为""导致printf刷新缓冲区并需要额外的时间才能完成您的内容。要进行测试,请注释掉 printf 并添加一个比超时长得多的 sleep(( 调用,看看它是否有效。还可以从 printf 中删除换行符以避免缓冲区刷新并查看它是否再次中断。

如果这有效,那么您可以延长超时持续时间,添加 sleep(( 调用或找到不同的同步机制。

如果你对信号感到满意并且只打算在 Linux 上使用 posix,你可以使用 wait((,但你必须以不同的方式协调你的线程。

其他信息:来自 IBM

如果您在程序中使用 system(( 函数,请不要依赖 clock(( 进行程序计时,因为对 system(( 的调用可能会重置时钟。

在多线程 POSIX C 应用程序中,如果要使用基于 POSIX.4a 草案标准的函数创建线程,则 clock(( 函数是线程范围的。

双重编辑:没关系,我看到你的秒是一个整数,而不是共享。值得注意的是要避免的system((调用,尽管我在这里看不到它。

clock(( 是导致整个问题的罪魁祸首。 clock(( 测量进程使用的 CPU 时间。由于我在此过程中生成多个计时器线程,因此 CPU 时间变得相当少。因此,clock(( 返回一个较小的值。但是将 printf(( 与 "" 一起使用会增加 CPU 时间,使其完全符合需要,因此无法观察到该问题。

最新更新