登录后,我的程序需要等待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;
}
答案 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