【发布时间】:2020-12-20 17:29:34
【问题描述】:
我正在创建一个小型 C++ 服务器,它应该像这样在无限循环中处理请求。
void Server::start_accept_loop(int server, SSL_CTX* ctx){
sockaddr_in incoming_addr;
socklen_t len = sizeof(incoming_addr);
int client_sock;
SSL* ssl;
while(Server::is_accepting){
client_sock = accept(server, (sockaddr*)&incoming_addr, len);
ssl = SSL_new(ctx);
SSL_set_fd(ssl, client_sock);
if (SSL_accept(ssl) == -1){
printf("Unable to accept ssl connection\n");
}else{
std::shared_ptr<Client> client (new Client(ssl));
std::thread th (background_client, client);
}
}
}
void Server::background_client(std::shared_ptr<Client> client_ptr){
std::shared_ptr<Client> client = client_ptr;
int request = 0;
request = client->get_request();
...
}
其实我有几个问题。
- 当创建的客户端 shared_ptr 在线程创建后超出范围时,它会减少引用计数并释放对象。这是新线程的竞争条件,或者是在
std::thread th (background_client, client);行增加了引用计数。基本上,我想知道是否需要在 while 循环超出范围并创建新的 shared_ptr 之前等待一段时间,或者是否需要立即增加引用计数? - 我的第二个问题是关于 SSL 结构指针的。如果底层的 client_sock 和 incoming_addr 对象超出范围而没有在堆上动态创建,那么可能依赖于这些的 SSL 连接是否存在问题,或者 SSL 指针是否包含所有这些信息的符合动态副本?李>
- 还有什么我应该知道的吗?
谢谢。
【问题讨论】:
-
问题 1 和 2 真的不相关,我认为它们应该是单独的帖子。
-
它们都是范围问题。我认为它们是相关的。我无法使用相同的代码创建 2 个帖子。
-
好吧,在上面的代码中你创建线程然后立即离开作用域。它会立即抛出异常。如果您不想等到它完成,您应该使用
detach()。一般来说,您应该使用更好的多线程框架,而不是仅仅创建线程来管理连接,因为您应该正确安全地退出应用程序。如果不是所有分离的线程都完成了他们的工作,那么这是一个问题。而你想对所有任务和退出但优雅?那该怎么办呢? -
是的,我必须分离线程才能工作。我不明白你的其他问题。它是一个服务器,所以它应该一直运行,除了维护等。所以在使用时我不介意线程被分离。
标签: c++ multithreading openssl smart-pointers