0

rpc サーバーであるアプリケーションにサードパーティ ライブラリ (dcerpc) を使用しています。サードパーティ関数が名前空間 third にあるとしましょう。

着信リクエストをリッスンするために、スレッドで third::listen を呼び出します。

「3番目」は、このリッスンを中断してスレッドを適切に終了するためのすべてのメカニズムを提供しますが、機能しないか、正しい方法で実行しません。最初にライブラリ ツール (デモ サンプル、メーリング リスト、ソース コードを参照して理解する...) を使ってすべてを試しましたが、成功しませんでした。

そこで私は別の方法を試します: リッスンしているスレッドを激しく殺します。しかし、 third::listen にはキャンセルポイントがないと思います。

したがって、このコード(上記のリッスン関数で third::listen をシミュレートします):

void* listen(void*)
{
    cout << "listening for calls...." << endl;

    while (true) {}
    printf ("Server stoppped listening\n");
    return 0;
}


int main()
{

    pthread_t thread = 0;

    int res = pthread_create(&thread, 0, listen, 0);
    cout << "pthread_create res: " << res << endl;

    sleep(1);

    bool isThreadRunning = (pthread_tryjoin_np(thread, 0) != 0);
    cout << "Thread is running: " << isThreadRunning << endl;

    res = pthread_cancel(thread);
    cout << "pthread_cancel res: " << res << endl;

    sleep(1);

    isThreadRunning = (pthread_tryjoin_np(thread, 0) != 0);
    cout << "Thread is running: " << isThreadRunning << endl;

    res = pthread_join(thread, 0);
    cout << "pthread_join res: " << res << endl;

    return 0;
}

出力します:

pthread_create res: 0
listening for calls....

Thread is running: 1
pthread_cancel res: 0
Thread is running: 1

および pthread_join(thread, 0) ブロック (キャンセル ポイントがないためロジック)。

私の質問:このスレッドを殺す方法!!

シグナルを試してみましたが、スレッドだけでなくプロセス全体が停止します。

私の最後の試みは、リスニングを専用のフォーク プロセスに分離することですが、私のプロジェクトのコンテキストでは、フォークするのは本当に面倒です (それは別の話です)。

助けてくれてありがとう。

ニコラス。

4

1 に答える 1

1

スレッドをキャンセルできるかどうかは、そのキャンセル状態タイプによって異なります。デフォルトの状態は ですenabled。それでいいです。ただし、デフォルトのタイプはdeferred. つまり、スレッドにキャンセル リクエストを送信すると、キャンセル ポイントに到達するまで延期されます。スレッドは空のループで何もしないため、キャンセル ポイントにはまったく到達しません。したがって、 には応答しませんpthread_cancel()

PTHREAD_CANCEL_ASYNCHRONOUS通常、スレッドを終了させるスレッドのキャンセル タイプを設定できます。電話

pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, 0);

ループ前。

または、キャンセル ポイントである関数の 1 つを呼び出すことができます。たとえばfflush(stdout);、ループ内で実行します。

POSIX では、キャンセル ポイントとして多くの関数がリストされています。そのようなリストについては、キャンセル ポイントを参照してください。

あなたが与えた限られた情報でスレッドの終了に応答しない「サードパーティ」ライブラリについてコメントすることはできません。

于 2015-12-02T20:18:53.690 に答える