将指针传递给线程而不超出范围

时间:2012-06-14 10:04:48

标签: c++ multithreading

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

我需要创建一个:

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

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

但是我意识到在每个帖子中,我都要打电话:

    p->doProcess(); 

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

但是,除非我致电p->Init(),否则此功能无效。

从现在起我至少有2个p范围(一个在main()中创建,N个在N个线程中创建),我该如何设计我的线程,这样类就可以传入范围错误? [我的约束是必须在p->Init()]

中调用main()

2 个答案:

答案 0 :(得分: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_ptr(或std::tr1::shared_ptr或{{1如果你坚持使用2011年之前的语言)。例如:

boost::shared_ptr

顺便说一下,为什么在构建对象后你需要调用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. } 函数?为什么不在构造函数中初始化它,因为那是构造函数的用途?

答案 1 :(得分: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;
}