C++ で Linux 用の MT プログラムを書いていますが、スレッドのキャンセルがどのように行われるか知りたいです。
私が理解している限り、スレッドがキャンセルされると、クリーンアップ関数がスレッドの関数内で呼び出され、スレッドの関数が強制的に終了されます。これは次の 2 つのことを意味します。
- スレッドがキャンセルされても、スレッドの関数内で作成されたすべての C++ オブジェクトのデストラクタを呼び出します。
- スレッドの関数で作成されたオブジェクトへのポインターをクリーンアップ関数に渡すことができます。
私は正しく、以下のコードは問題なく動作しますか?
以下のコードでもう 1 つ質問があります。スレッドが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);
}