将 std::shared_ptr 传递给线程并立即超出范围

问题描述

我正在创建一个小型 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();
    ...
}

其实我有几个问题。

  1. 当创建的客户端 shared_ptr 在线程创建后超出范围时,它会减少引用计数并释放对象。它是新线程的竞争条件,或者是在 std::thread th (background_client,client); 行增加的引用计数。基本上,我想知道是否需要在 while 循环超出范围并创建新的 shared_ptr 之前等待一段时间,或者引用计数是否立即增加?
  2. 我的第二个问题是关于 SSL 结构指针的。如果底层的client_sock 和incoming_addr 对象在没有在堆上动态创建的情况下超出范围,那么可能依赖于这些的SSL 连接是否存在问题,或者SSL 指针是否包含所有这些信息的符合动态副本?立>
  3. 还有什么我应该知道的吗?

谢谢。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)