2

我正在使用一个支持线程的小型嵌入式 RTOS。我正在用 C++ 编程,并想创建一个类,它允许我将任何类的任意成员函数作为线程运行。RTOS 不直接支持从成员函数创建线程,但如果从线程中调用它们就可以正常工作。Boost::thread 在我的平台上不可用。

我目前正在通过一个朋友 thread_starter() 函数以临时方式启动线程,但似乎我必须为每个我想从中运行线程的类设置一个单独的线程。我当前的线程基类解决方案使用虚拟 run() 函数,但这有一个缺点,即我只能为一个类启动 1 个线程,并且仅限于 run() 函数 + 依次调用的任何内容(即我不能从 run() 优雅地运行任意函数)

理想情况下,我想要一个模板化的类“线程”,这样我就可以在类“X”成员函数中执行以下操作:

class X 
{
    run_as_thread(void* p)';
};

X x;
void* p = NULL;

template<X>
thread t(x, X::run_as_thread, p);

//somehow causing the following to be run as a thread :
x->run_as_thread(p);

很抱歉,如果以前在这里做过死,但我似乎只能找到使用 Boost::thread 来完成此操作的参考,而这对我来说是不可用的。我也无权访问堆,因此所有全局变量都必须是静态的。

非常感谢,

麦克风

4

4 回答 4

2

如果您的编译器足够现代以支持 C++11线程功能,那么您可以使用它。

也许是这样的:

class X
{
public:
    void run(void *p);
};

X myX;
void *p = nullptr;

std::thread myThread(std::bind(&X::run, myX, p));

现在X::run将作为线程运行。在线程完成后调用std::thread::join以清理它。

于 2012-08-15T13:25:56.800 回答
1

假设你的 RTOS 工作起来有点像 pthreads,并且你没有 C++11(这可能会假设你的线程支持)你可以使用这种机制,但是你需要一个类中的静态方法,它需要一个指针到类的一个实例。因此(大致)

class Wibble
{
  public:
    static void *run_pthread(void *me)
    {
         Wibble *x(static_cast<Wibble *>(me));
         return x->run_thread_code();
    }
  private:
    void *run_thread();
};

Wibble w;
pthread_create(&thread, &attr, Wibble::run_pthread, &w);

传递参数作为练习留给读者......

这可以通过一些努力来模板化,但这就是胆量需要工作的方式。

于 2012-08-15T13:36:31.690 回答
0

听起来您要问的是一种在类上异步运行任意成员函数的方法。我从您对虚拟run()功能的评论中得出:

“这有一个缺点,我只能为一个班级启动 1 个线程”

...意味着您不喜欢该选项,因为它会导致所有函数调用在该线程中执行,而您想要的是能够将单个函数调用线程化,而不仅仅是创建面向对象的线程抽象。

您应该查看目标平台的线程池库。鉴于不了解您的实际平台或要求,我无法提供任何具体建议,但这应该为您提供一个搜索词,并希望获得一些富有成效的结果。

于 2012-08-15T13:41:01.770 回答
0

在此处查看我关于在非增强项目中的不相关类之间传递 C++ 回调的帖子。

于 2012-08-15T13:38:54.307 回答