下面有代码,它使用uWebSockets作为后端的库。现在我想正确地关闭它,它会导致内存泄漏(使用val研检查)。
#include <App.h>
#include <thread>
#include <chrono>
int main()
{
using namespace std::chrono_literals;
us_listen_socket *token{};
auto start_server = [&token] {
uWS::App()
.listen(9001, [&token](auto *listenSocket) {
if (listenSocket) token = listenSocket;
})
.run();
};
auto start_timer = [&token] {
std::this_thread::sleep_for(2s);
us_listen_socket_close(token);
};
...
}
...
如下:
泄露版本:
std::thread(start_server).detach();
start_timer();
无泄漏版本:
std::thread(start_timer).detach();
start_server();
我知道只有当我将运行服务器的代码移到单独的线程时,程序才会泄漏,但我无法解释原因。
发布于 2019-03-21 17:36:32
如果我正确理解您的代码,那么两个版本都有未定义的行为,因为您有两个线程同时访问对象token
,其中一个线程正在写入对象,另一个线程正在从中读取。我不知道在精确2秒之后试图关闭token
的确切目的是什么;但是不管它是什么,您都必须使用适当的同步,例如使用std::mutex
来保护对token
的访问,或者至少使token
原子性。程序将继续泄漏,因为这只取决于某人连接所需的时间是否超过2秒(我猜想这就是这里所发生的),但至少泄漏将是定义良好的行为…。
https://stackoverflow.com/questions/55291444
复制