【发布时间】:2016-03-14 12:46:17
【问题描述】:
我正在将应用程序移植到 Windows 上,并发现当跨 DLL 边界中断 boost::thread 时,线程不会被中断。
boost 库是静态链接的,并且使用调试运行时和链接到共享运行时库的多线程支持构建。 /MDd
该项目使用 msvc12 (2013) 编译(与编译 boost 的编译器相同)。
我制作了一个简短的示例项目来演示该问题:
test.cpp
#include <iostream>
#include "boost/thread.hpp"
#include "test_library.h"
#include <iostream>
int main()
{
qDebug() << "Hello";
Test_library test;
qDebug() << "Starting thread";
boost::thread thread = boost::thread(&Test_library::Loop, &test);
boost::this_thread::sleep_for(boost::chrono::seconds(3));
qDebug() << "interrupt thread";
thread.interrupt();
qDebug() << "Joining thread";
thread.join();
qDebug() << "Closing Program";
return 0;
}
test_library.cpp
#include "test_library.h"
#include "boost/thread.hpp"
void Test_library::Loop()
{
qDebug() << "Starting loop";
while(true)
{
qDebug() << "Looping";
boost::this_thread::interruption_point();
boost::this_thread::sleep_for(boost::chrono::milliseconds(500));
}
qDebug() << "Looping finished";
}
test_library.h
#pragma once
#include "test_library_global.h"
#include <QtCore>
class TEST_LIBRARYSHARED_EXPORT Test_library
{
public:
void Loop();
};
TestProject.pro(QMake 文件)
DESTDIR = ../TestProjectDeploy/
SOURCES += \
test.cpp
LIBS += -L$$DESTDIR -ltest_library
include(../BoostIncludes.pri)
DESTDIR = ../TestProjectDeploy/
QT -= gui
TARGET = test_library
TEMPLATE = lib
DEFINES += TEST_LIBRARY_LIBRARY
SOURCES += test_library.cpp
HEADERS += test_library.h
TestLibrary.pro
include(../BoostIncludes.pri)
DESTDIR = ../TestProjectDeploy/
QT -= gui
TARGET = test_library
TEMPLATE = lib
DEFINES += TEST_LIBRARY_LIBRARY
SOURCES += test_library.cpp
HEADERS += test_library.h\
test_library_global.h
unix {
target.path = /usr/lib
INSTALLS += target
}
BoostIncludes.pri
win32:INCLUDEPATH += "C:/Libraries/boost_1_60_0/"
LIBS = "-LC:/Libraries/boost_1_60_0/stage/lib/" \
"C:/Libraries/boost_1_60_0/stage/lib/libboost_thread-vc120-mt-gd-1_60.lib" \
"C:/Libraries/boost_1_60_0/stage/lib/libboost_system-vc120-mt-gd-1_60.lib" \
"C:/Libraries/boost_1_60_0/stage/lib/libboost_chrono-vc120-mt-gd-1_60.lib" \
"C:/Libraries/boost_1_60_0/stage/lib/libboost_timer-vc120-mt-gd-1_60.lib" \
程序输出:
Hello
Starting thread
Starting loop
Looping
Looping
Looping
Looping
Looping
Looping
interrupt thread
Looping
Joining thread
Looping
Looping
Looping
Looping
Looping
Looping
【问题讨论】:
标签: c++ multithreading boost