我正在尝试开发线程抽象(来自Windows API的POSIX线程和线程),我非常希望能够使用方法指针启动它们,而不是函数指针。
我想要做的是将线程抽象为具有纯虚方法“runThread”的类,该方法将植入未来的线程类中。
我还不知道Windows线程,但是要启动POSIX线程,您需要一个函数指针,而不是方法指针。 而且我无法找到一种方法将方法与实例相关联,因此它可以作为一个函数工作。 我可能只是找不到关键字(我一直在搜索很多),我认为这几乎是Boost :: Bind()所做的,所以它必须存在。
你能帮助我吗?
答案 0 :(得分:9)
不要这样做。使用boost::thread
。
使用boost::thread
,你可以使用任何签名void()
的仿函数启动线程,这样就可以使用std::mem_fun
和std::bind1st
,就像
struct MyAwesomeThread
{
void operator()()
{
// Do something with the data
}
// Add constructors, and perhaps a way to get
// a result back
private:
// some data here
};
MyAwesomeThread t(parameters)
boost::thread(std::bind1st(std::mem_fun_ref(&t::operator()), t));
编辑:如果你真的想抽象POSIX线程(这并不难),你可以这样做(我给你留下pthread_attr的初始化)
class thread
{
virtual void run() = 0; // private method
static void run_thread_(void* ptr)
{
reinterpret_cast<thread*>(ptr)->run();
}
pthread_t thread_;
pthread_attr_t attr_;
public:
void launch()
{
pthread_create(&thread_, &attr_, &::run_thread_, reinterpret_cast<void*>(this));
}
};
但boost::thread
便携,灵活且易于使用。
答案 1 :(得分:2)
你真的应该使用Boost.Thread。但是如果你不能并且启动一个线程的调用允许你将一个参数传递给你的线程函数,一个常见的习惯用法就是有一个独立的或静态的成员函数,它将参数转换为一个对象指针。 e.g。
class Thread {
public:
void start() { start_thread(_work, this); } // whatever call starts a thread
void work() {} // does thread work
private:
static void _work(void* param) {
(reinterpret_cast<Thread*>(param))->work();
}
}
答案 2 :(得分:1)
您需要一个C ++ API来进行线程化。类似于boost :: thread(这与新C ++中的API非常相似)。操作系统线程API通常在C中,你只是不能将非静态成员函数指针传递给它们,也不能传递函子(boost :: bind创建的)。
答案 3 :(得分:0)
嗯,这实际上是一个练习,我没有权利使用任何东西(甚至不是Boost)。 当然我不必这样做(我只需要开发一个线程抽象),我只想:我曾经使用SFML线程抽象,我只是喜欢它。这是一种处理它的性感方式。
Ferruccio方式似乎很好! 如果work()方法是纯虚拟的,它可以在任何实现线程抽象的类中实现......它会工作得很好,对吧? (我不确定它是否会,但根据我对C ++的基本知识,我想应该这样做?)