参考这篇文章,我有一个纯虚拟类:
#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();
}
}
但这似乎导致我的应用程序运行时崩溃......