【问题标题】:IPC: collecting data from clients every second [closed]IPC:每秒从客户端收集数据[关闭]
【发布时间】:2020-03-22 07:17:42
【问题描述】:

我想从连接到我的服务器的所有客户端收集数据,我想最多等待 1 秒。如何用信号量做到这一点? 我当前的代码:

int players=2;
while(1){
    //request for choice
    for(int i = 0; i<players; i++)
        sem_post(&sharedMemory->request_choice);
    //wait for data
    for (int i = 0;i<players; i++)
        //ok..I have data but not in 1 second..
        sem_wait(&sharedMemory->got_choice);


    //updating data..
}

【问题讨论】:

标签: c pthreads semaphore


【解决方案1】:

POSIX platforms provide sem_timedwait():

概要

#include <semaphore.h>
#include <time.h>

int sem_timedwait(sem_t *restrict sem,
       const struct timespec *restrict abstime);

描述

sem_timedwait() 函数应锁定所引用的信号量 semsem_wait() 函数一样。但是,如果信号量 不能在不等待另一个进程或线程的情况下被锁定 通过执行sem_post() 函数解锁信号量,等待 应在指定的超时到期时终止。

超时将在abstime指定的绝对时间时到期 通过,由超时所基于的时钟测量(即, 当该时钟的值等于或超过abstime),或者如果 abstime 指定的绝对时间已经过了 通话时间。

超时应基于CLOCK_REALTIME 时钟。这 超时的分辨率应为时钟的分辨率 它所依据的。 timespec 数据类型定义为结构 在&lt;time.h&gt; 标头中。

在任何情况下,如果 信号量可以立即锁定。 abstime的有效期 信号量是否可以立即锁定,不需要检查。

返回值

sem_timedwait() 函数应返回零,如果调用 进程成功执行了信号量锁定操作 sem 指定的信号量。如果调用不成功,状态 信号量的值应保持不变,函数应返回一个 -1 的值并设置errno 以指示错误。

错误

如果出现以下情况,sem_timedwait() 函数将失败:

...

[ETIMEDOUT]
    The semaphore could not be locked before the specified timeout expired.

该链接还提供了此示例用法:

/* Calculate relative interval as current time plus
   number of seconds given argv[2] */


if (clock_gettime(CLOCK_REALTIME, &ts) == -1) {
    perror("clock_gettime");
    exit(EXIT_FAILURE);
}
ts.tv_sec += atoi(argv[2]);


printf("main() about to call sem_timedwait()\n");
while ((s = sem_timedwait(&sem, &ts)) == -1 && errno == EINTR)
    continue;       /* Restart if interrupted by handler */

【讨论】:

  • 好的,但是我想同时为所有客户端等待 1 秒,可以吗?
  • 这取决于您如何实现同步 - 您可以使用多个信号量。除了共享内存和信号量之外,还有很多方法可以处理这个问题——消息队列或管道立即浮现在脑海中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
  • 2021-09-30
相关资源
最近更新 更多