私はC++ファイルのソースであるTCLファイルを持っています。 私は最後にすべてのTCL呼び出しを処理するためにTcl_DoOneEvent関数を使用しています。 また、Main関数で呼び出されるスレッドがいくつかあります。すべてのスレッドと関数を終了するために、私はquit関数を書いています。したがって、現在のケースでは、すべてのpthreadおよびその他の関数は、最後に呼び出されるTcl_DoOneEvent関数を除いて終了しています。セグメンテーションエラーが発生しています。 はwhile(1)関数を他の関数から抜け出す方法です。 whileループを終了するためにTcl_DoOneEvent関数を終了する
main()
{
...
...
pthread_create(thread1);
pthread_create(thread2);
while(1) Tcl_DoOneEvent(TCL_ALL_EVENTS);
return(0);
}
quit_fn()
{
...
...
pthread_cancel(thread1);
pthread_cancel(thread2);
...
// exit(0) ; -> this also results in segmentation error
}
quit機能を使用すると、メインスレッドにイベントを送信することをお勧めします。イベントは簡単なハンドラを持つことができます。あるいは、イベントハンドラは 'exitLoop'をセットすることができます。これは、あるスレッドからのみアクセスされるため、' volatile'である必要はありません。このユースケースでは 'TCL_DONT_WAIT'は推奨されません。 Tclはイベントなしで効率的にスリープします。 –
私はそれに同意し、イベントを送信して、Tclがスリープを処理できるようにします。フラグは他のスレッドから決して使用されない限り、volatileは必要ありません(ただし、コードの場合はわかりません)。 –