带参数的异步C ++ WaitForSeconds函数

时间:2015-06-03 11:53:19

标签: c++ asynchronous

登录后,我的程序需要等待4秒,然后在写入分数之前检查播放器是否仍然登录。我将该函数称为异步函数:

std::async (scoreAttendance, p); //p = pointer to player

这是我的功能:

void scoreAttendance(player *p)
{
    time_t beginT = time(NULL);
    time_t   endT = time(NULL);
    while(difftime(endT, beginT) < p->attendingTime){
        endT = time(NULL);}
    if (p->user != NULL){
        sendScore(saveScore);}
}

但它没有异步,它阻止了整个程序4秒。我做错了什么?

其他信息: 该程序在游戏服务器上运行。如果连接的RFID侦听器读取新的RFID,则通过TCP / IP向游戏服务器通知该登录。接收的数据在LoginFunction中处理,该函数调用async scoreAttendance():

//TCP Server handles the received data
void session::handle_read(const boost::system::error_code& error,
                          size_t bytes_transferred)
{
  [...]
  std::vector<char> response =
               packet.process(data_, bytes_transferred, ip);
  [...]
}

//This leads to the process function
void process(datapacket& gamedata)
{
  std::string command = gamedata.getvalue("command");
  PROCESS_COMMAND(u,"plug/rfid/read", loginStation);
  [...]
}

//process calls this login function
void loginStation(datapacket& gamedata)
{
   [...]
   //Identifies the User by his RFID
   [...]
   std::async (scoreAttendance, p);
   return;
}

2 个答案:

答案 0 :(得分:0)

根据文件:

  

与async相同(std :: launch :: async | std :: launch :: deferred,f,args ...)。换句话说,f可以在另一个线程中执行,或者当查询结果std :: future时,它可以同步运行。

您是否在异步调度之前的任何时间查询结果std::future

答案 1 :(得分:0)

问题是TCP侦听器在它自己的Thread中,所以异步调用没有阻塞主线程但是侦听器线程。 我们通过在显式的Attending Time Counter线程中强制计数器并将两个线程的共享方法标记为 scope_locked 来解决此问题,以防止出现与双重访问相关的问题。

1 - 0.83 = 0.16