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) ブロック (キャンセル ポイントがないためロジック)。
私の質問:このスレッドを殺す方法!!
シグナルを試してみましたが、スレッドだけでなくプロセス全体が停止します。
私の最後の試みは、リスニングを専用のフォーク プロセスに分離することですが、私のプロジェクトのコンテキストでは、フォークするのは本当に面倒です (それは別の話です)。
助けてくれてありがとう。
ニコラス。