我获得了预定义类/函数的预定义.lib文件。
我需要创建一个:
Cdefined *p = new Cdefined;
p->Init();
在main()程序中,在调用我的线程之前初始化我的类对象。
但是我意识到在每个帖子中,我都要打电话:
p->doProcess();
为每个线程运行一段代码。
但是,除非我致电p->Init()
,否则此功能无效。
从现在起我至少有2个p范围(一个在main()
中创建,N个在N个线程中创建),我该如何设计我的线程,这样类就可以传入范围错误? [我的约束是必须在p->Init()
]
main()
答案 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;
}