Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
卸载库期间Windows套接字挂起_Windows_Visual Studio_Sockets_C++17_Boost Asio - Fatal编程技术网

卸载库期间Windows套接字挂起

卸载库期间Windows套接字挂起,windows,visual-studio,sockets,c++17,boost-asio,Windows,Visual Studio,Sockets,C++17,Boost Asio,(本问题结尾处可能的解决方案) 在测试主应用程序中动态加载名为X(在Windows 10上,最新版本VS编译器)的库 X库打开一个名为Boost管道连接(1.71)的窗口 卸载库: 在调用每个析构函数之后,在 ~winsock\u init被调用 在清洁服务期间,最后一个挂起在清理中(数据) 因为有一项工作非常出色 这是一个有点复杂的场景,但我无法以不同的方式重现它 我的问题与此类似: 在上述链接下,有一个答案: “是的,您可能无法在线程之间传递消息 你要卸下行李了。” 这是我的下一次尝试 如

(本问题结尾处可能的解决方案)

在测试主应用程序中动态加载名为X(在Windows 10上,最新版本VS编译器)的库

X库打开一个名为Boost管道连接(1.71)的窗口

卸载库:

  • 在调用每个析构函数之后,在 ~winsock\u init被调用
  • 在清洁服务期间,最后一个挂起在清理中(数据) 因为有一项工作非常出色
  • 这是一个有点复杂的场景,但我无法以不同的方式重现它

    我的问题与此类似:

    在上述链接下,有一个答案:

    “是的,您可能无法在线程之间传递消息 你要卸下行李了。”

    这是我的下一次尝试

    如果你需要更多的细节,请告诉我。我有一个非常好的调试环境。。。请随时询问更多相关细节

    (如果不是din负载,则不会导致任何问题。)

    注意事项:

    为什么在加载dyn库的过程中会有这么多套接字初始化? Winsock_init打了很多次电话,为什么

    编辑:

    将run()更改为poll()更改了场景,并且我的测试应用程序没有挂起,但是:

    • 我不知道run()和poll()之间的区别。更具体地说,我不确定我是否意识到所有的副作用(我没有找到详细的比较)
    • 卸载库(FreeLibrary)时应用程序崩溃

    阅读您的评论和其他帖子,将poll()改为run()可以解决这个问题。我认为我目前的问题在于boost日志:

    无关:即使多次调用包装器
    Winsock_init
    ,我怀疑Windows函数
    WSAStartup
    也不会被多次调用。这可能是一些单例操作,以确保您已经初始化了Windows socket.WSAStartup,确实调用了一次。但是,函数调用了两次,并且由于init计数器WSAStartup没有调用两次。单身人士在哪里?处理每个类的构造函数。只有一个文件被传递到套接字、一个io_服务和一个io_服务工作者。不是两次,好几次。我只是猜测他们可能会在内部使用singleton进行一次init/shutdown。你能创建并发布一个?如果io_上下文确实有未完成的工作,run()将永远不会返回,这可能会导致问题-是否所有异步操作都已取消,没有新操作排队,并且池中的线程在调用拆卸开始/io_上下文的dtor之前已连接?poll()永远不会阻塞,只会调用准备好执行的处理程序(例如,在调用时完成异步读取)。