質問

書いMTプログラムLinux C++なのか知りたい方のスレッドの取消を行います。

調査を実施しているのは、同じのかを解明するスレッドが中止と浄化機能と呼ばれる内側のスレッドの機能は、スレッドの機能が強制終了されます。この意味は二つのことをやろうとしてい

  1. 時にスレッドが解除でいdestructors foすべてC++で作成したオブジェクト内のスレッドの機能です。
  2. まきを清掃機能へのポインタで作成したオブジェクトはスレッドの機能です。

私右、以下のコードを病気に働けるのでは。


もう一つ質問で以下のコードがスレッドが中止にどこかに 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);
}
役に立ちましたか?

解決

(実際には任意の2.6カーネルを実行していることを意味する)NPTLを使用して、任意の近代的なLinuxディストリビューションでは、NPTLは、デストラクタを呼び出して、擬似例外スタックをアンワインドします。

実際にNPTLは、それが強制的にスタックがアンワインド呼ん実装することにより、それを主張しています。あなたはキャッチ(...)で擬似例外をキャッチすることができますが、そうならば、あなたはその後、それを再スローしなければならないか、全体のプロセスが終了されます。

クリス

他のヒント

Destructorsするという仮に自分を自由にメモリ確保されるオブジェクトの清掃。れます。

おすすめの清掃活動に係る正しい。

キャンセルスレッドのスタックが巻き戻さないことを主張 - ローカル・オブジェクトの非破壊をもたらすが、 - スレッドのスタックが巻き戻されて、次の反例であること@クリスによって主張と矛盾しています

#include <climits>
#include <iostream>
#include <pthread.h>
#include <thread>
#include <unistd.h>

class Obj {
public:
    Obj()  { std::clog << "Obj() called\n"; }
    ~Obj() { std::clog << "~Obj() called\n"; }
};

static void cleanup(void* arg) {
    std::clog << "cleanup() called\n";
}

static void run() {
    Obj obj{}; // Local object
    pthread_cleanup_push(cleanup, nullptr);
    ::pause(); // Thread cancelled here
    pthread_cleanup_pop(1);
}

int main(int argc, char **argv) {
    std::thread thread([]{run();});
    ::sleep(1);
    ::pthread_cancel(thread.native_handle());
    thread.join();
}
実行すると

は、上記のプログラムは、ローカルオブジェクトのデストラクタは、スレッドがキャンセルされたときに呼び出され、実際に、あることを示しています:

$ ./a.out 
Obj() called
cleanup() called
~Obj() called
$ 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top