Threading от статического члена в DLL - PullRequest
1 голос
/ 22 декабря 2010

У меня проблема с запуском потока внутри класса A, например, где класс A является статическим членом класса B с dll. Я использую Visual Studio 9 и повысить 1.40. Пожалуйста, рассмотрите следующий код:

mylib.h:


#include <boost/thread.hpp>
#include <windows.h>

#ifdef FOO_STATIC
    #define FOO_API
#else
    #ifdef FOO_EXPORT
    #define FOO_API __declspec(dllexport)
    #else
    #define FOO_API __declspec(dllimport)
    #endif
#endif


class FOO_API foo{
    boost::thread* thrd;
    public:
    foo();
    ~foo();
    void do_work();
};

class FOO_API bar{
    static foo f;
public:
    static foo& instance();
};

mylib.cpp:


#include "mylib.h"

foo::foo() 
{
    thrd = new boost::thread(boost::bind(&foo::do_work,this));
}

foo::~foo(){
    thrd->join();
    delete thrd;
}

void foo::do_work(){
    printf("doing some works\n");
}

foo& bar::instance(){return f;}

foo bar::f;

в исполняемом приложении у меня есть:

main.cpp:


#include "mylib.h"
void main(){
    bar::instance();
}

Если я статически связываю mylib с исполняемым приложением, он выводит «выполнение некоторых работ», а если я динамически связываю его (dll), он ничего не делает.

Я действительно ценю любую помощь.

Ответы [ 2 ]

0 голосов
/ 22 декабря 2010

Из документации MSDN :

Если ваша DLL связана с C библиотека времени выполнения (CRT), запись точка, предоставленная ЭЛТ, называет конструкторы и деструкторы для глобальные и статические объекты C ++. Следовательно, эти ограничения (*) для DllMain также применяется к конструкторам и деструкторы и любой код, который звонил от них.

(*) Ограничения включают общение с потоками.

Лучше всего сделать глобальную переменную указателем, а также создать и освободить объект в специальных процедурах обратного вызова.

См. Также этот полезный SO ответ.

0 голосов
/ 22 декабря 2010

Ваша программа может завершиться до завершения потока. Вы можете попробовать подождать после вызова bar::instance() или присоединиться к потоку в main. Еще кое-что можно попробовать сбросить стандартный вывод после вызова printf.

...