查看完整版本: [-- 【未解决】饿汉式单例开辟线程失败,求解原因 --]

QTCN开发网 -> Qt基础编程 -> 【未解决】饿汉式单例开辟线程失败,求解原因 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

shixingya 2022-09-30 10:19

【未解决】饿汉式单例开辟线程失败,求解原因

以下DEMO用VS2017编译,必现线程创建卡住,无下文。
VS2019、Ubuntu下编译,运行正常。 求解具体原因,是IDE的问题吗?



代码附在下面,也可从这里下载 https://github.com/shixingya/selfFileBed/raw/main/hungry_thread_create_in_singleton.zip
dllimpl.h
  1. #ifndef DLL_IMPL_H
    #define DLL_IMPL_H
    #include <iostream>
    #include <mutex>
    #include <thread>

    #ifndef XTHREADPOOL_DLL
    # ifdef _WIN32
    #  if defined( BUILD_DLL )
    #    define XTHREADPOOL_DLL __declspec(dllexport)
    #  elif defined( USE_DLL )
    #    define XTHREADPOOL_DLL __declspec(dllimport)
    #  else
    #    define XTHREADPOOL_DLL
    #  endif
    # else
    #  define XTHREADPOOL_DLL
    # endif
    #endif

    class XTHREADPOOL_DLL DLL_IMPL {
    public:
        DLL_IMPL() {
            std::cout << __FUNCTION__ << " begin create subThread." << std::endl;
            std::thread t1([]() {
                std::cout << "subThread : Hello World" << std::endl;
            });
            t1.join();//这里也可以试试detach  VS2019 detach运行正常/vs2017 detach运行异常
            std::cout << __FUNCTION__ << " out" << std::endl;
        }
    };
    using DLL_IMPL_Ptr = DLL_IMPL * ;
    class XTHREADPOOL_DLL DLL_IMPLSingleton {
    public:
        static DLL_IMPL_Ptr get();
    private:
        static DLL_IMPL s_impl_;
    };
    #endif
dllimpl.cpp
  1. #include "dllImpl.h"
    DLL_IMPL DLL_IMPLSingleton::s_impl_;

    DLL_IMPL_Ptr DLL_IMPLSingleton::get() {
        DLL_IMPL_Ptr ptr = &DLL_IMPLSingleton::s_impl_;
        return ptr;
    }
main.cpp
  1. #include <iostream>
    #include "dllimpl.h"

    int main(int argc, char* argv[]){
        std::cout << " in main thread " << std::endl << std::flush;
        DLL_IMPL imp;
        std::cout <<"main thread "<<std::endl<<  std::flush;
        getchar();
        return 0;
    }
cmakelist.txt
  1. # vs2017最高支持3.12
    cmake_minimum_required(VERSION 3.10)

    project (XThreadPool)
    set(SHARED_LIB_SOURCES    
        src/dllimpl.cpp
    )

    set(EXE_SOURCES
        test/main.cpp
    )
    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_EXTENSIONS OFF)
    add_library(xthreadpool SHARED ${SHARED_LIB_SOURCES})
    SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb -std=c++17 -pthread")
    SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall -std=c++17 -pthread")
    set(CMAKE_CXX_FLAGS_RELEASE "/MT")
    set(CMAKE_CXX_FLAGS_DEBUG "/MTd")

    target_compile_definitions(xthreadpool PRIVATE BUILD_DLL )

    target_include_directories(xthreadpool
        PUBLIC ${PROJECT_SOURCE_DIR}/include
    )

    add_executable(test_xthreadpool  ${EXE_SOURCES} )
    target_compile_definitions( test_xthreadpool PRIVATE USE_DLL )
    target_include_directories( test_xthreadpool
        PRIVATE ${PROJECT_SOURCE_DIR}/include
        ${PROJECT_SOURCE_DIR}
    )

    target_link_libraries( test_xthreadpool
        PRIVATE xthreadpool
    )

    #这行可以生成VS下sln工程
    set_property ( DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ${PROJECT_NAME} )










onlyone 2022-09-30 11:34
还是按照流程写。
我记得 std:thread 需要有个 t.start() 启动 ?

如果不启动,下面的join肯定会卡主吧,一直死等线程结束。线程都没开始,等到天荒地老也不会结束啊。再者,你调试一下不久明白了,只有Join可能卡死。




xlinger 2022-11-21 13:11
在 dll 中直接创建线程是不对的

https://stackoverflow.com/questions/48809595/how-to-create-threads-in-dlls-c

圣域天子 2022-11-21 13:18
总觉得有些人比孔乙己还厉害。近20年来软件各方各面都搞出来一堆新名词,以彰显自己的能力

snow_man_0 2022-11-21 14:41
在构造函数里放两句话,就解决了
static bool flag=false;
if (flag==false) flag=true;
else "程序闪退";

不知道我理解的对不对

fsu0413 2022-11-23 08:40
DLL里带全局变量真的好吗。。。。
试试局部静态变量吧,那个是在第一次代码运行到里面的时候构造的


查看完整版本: [-- 【未解决】饿汉式单例开辟线程失败,求解原因 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled