4

我得到了一个预定义类/函数的预定义 .lib 文件。

我将需要创建一个:

    Cdefined *p = new Cdefined;
    p->Init();

在 main() 程序中在调用我的线程之前初始化我的类对象。

但是我意识到,在我的每个线程中,我都必须调用:

    p->doProcess(); 

为每个线程运行一段代码。

但是,除非我调用,否则此功能将不起作用p->Init()

由于现在我至少有 2 个 p 范围(一个在 中创建main(),N 个在 N 个线程中),我该如何设计我的线程,以便可以在没有范围错误的情况下传入该类?[我的限制是p->Init()必须调用main()]

4

2 回答 2

4

如果对象的生命周期只是绑定到 的范围main,那么这很容易 - 只需确保在销毁对象之前已停止并加入所有线程。这可以通过使用范围内的智能指针管理对象来更好地执行,main或者更简单地说,通过在 内赋予对象自动生命周期main

void thread_func(Cdefine *);

int main()
{
    Cdefine thing;
    thing.Init();

    std::thread thread1(thread_func, &thing);
    std::thread thread2(thread_func, &thing);

    // do stuff

    thread1.join();
    thread2.join();

    // Now it's safe to destroy the object
}

在更复杂的情况下,您不能简单地将对象绑定到比线程更广泛的范围,您可以考虑使用std::shared_ptrstd::tr1::shared_ptr或者boost::shared_ptr如果您坚持使用 2011 年之前的语言)来管理它。例如:

void thread_func(std::shared_ptr<Cdefine> p);

void spawn_threads()
{
    std::shared_ptr<Cdefine> p = std::make_shared<Cdefine>();
    p->Init();

    std::thread thread1(thread_func, p);
    std::thread thread2(thread_func, p);

    thread1.detach();
    thread2.detach();

    // The threads can carry on doing their thing, and it's safe to
    // drop our shared pointer. The object will be deleted when the
    // last thread drops its pointer to it.
}

顺便说一句,为什么在Init构造对象之后需要调用函数?为什么不在构造函数中初始化它,因为那是构造函数的用途?

于 2012-06-14T10:57:44.007 回答
1

Cdefined为每个线程创建一个实例,调用其Init方法,并将其作为参数传递给线程。

就像是:

for (int i = 0; i < NUM_THREADS; i++)
{
    Cdefined *p = new Cdefined;
    p->Init();
    create_thread(thread_func, p);
}

和线程函数:

void *thread_func(void *data)
{
    Cdefine *p = reinterpret_cast<Cdefine*>(data);

    for (;;)
    {
        // Do stuff...
        p->doProcess();
        // Do other stuff
    }

    return 0;
}
于 2012-06-14T10:17:40.443 回答