【发布时间】:2011-05-12 14:41:26
【问题描述】:
我正在用 C++ 为 Linux 编写 MT 程序,我想知道线程取消是如何执行的。
据我所知,当线程被取消时,清理函数在线程函数内部被调用并且线程函数被强制退出。这意味着两件事:
- 当线程被取消时,它仍然会调用线程函数内部创建的所有 C++ 对象的析构函数。
- 我可以将指向在线程函数中创建的对象的指针传递给清理函数。
我是对的吗,下面的代码工作得很好?
下面代码中还有一个问题,当线程在SECTION A的某处被取消时,second_thread_cleanup_function()会首先被调用,对吧?
class SomeObject
{
public:
~SimpleObject (void); // <- free dynamically allocated memory
void finalize (void);
// ...
}
void first_thread_cleanup_function (void* argument)
{
SomeObject* object (argument);
object->finalize ();
}
void second_thread_cleanup_function (void* argument)
{
// ... do something ...
}
void* thread_function (viod* argument)
{
SomeObject object;
pthread_cleanup_push (first_thread_cleanup_function, &object);
// ... some code ...
pthread_cleanup_push (second_thread_cleanup_function, NULL);
// ... SECTION A ...
pthread_cleanup_pop (0);
// .. some code ...
pthread_cleanup_pop (1);
}
【问题讨论】:
-
如果使用 C++ 编码,请记住 RAII:考虑使用 C++0x std::thread 或 C++ boost::thread,甚至通过异常模仿优雅退出(请参阅 drdobbs.com/architecture-and-design/207100682 for更多信息)。
-
我在考虑,但我必须用线程做一些具体的事情。我知道,我(大部分)正在重新发明轮子……
标签: c++ linux multithreading pthreads cancellation