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
- #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
- #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
- #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
- # 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} )
|
|