0

参考这篇文章,我有一个纯虚拟类:

#define CALL __stdcall
class IIEvent
{
    virtual ~IIEvent() {}

    virtual void CALL ev1(int) = 0;
    virtual void CALL ev2(int) = 0;
};

该接口用于实现发布-订阅者模式。库IIEvent在单独的线程中调用函数。

void generateEvent1( int i )
{
    // mListeners is a std::vector< IIEvent* >
    for ( auto& f : mListeners )
    {
        std::thread t( &IIOEvent::ev1, f, t ) );
        t.detach();
    }
}

但这给了我编译时错误(在这种情况下我使用的是 MinGW):问题似乎是调用约定。如果我删除调用约定一切正常。

那么如何启动具有某些特定调用约定的函数线程呢?

注意:这里需要调用约定以确保库与其他编译器一起使用。

感谢 Cory Nelson,一个解决方案可以是:

void generateEvent1( int i )
{
    // mListeners is a std::vector< IIEvent* >
    for ( auto& f : mListeners )
    {
        std::thread t( [f, i] ()
        {
            f->ev1( b );
        });
        t.detach();
    }
}

但这似乎导致我的应用程序运行时崩溃......

4

0 回答 0