私のプログラムでは、単一のスレッドプールを使用して、タイマータスク、非ブロッキングソケットI / Oなどのすべてのタスクをディスパッチします。タスクは実際にはコールバック関数であり、特定のイベントを受信したときに実行されます。
アーキテクチャは次のとおりです。
メインスレッドはepoll()を呼び出してI / Oイベントを収集し、I/Oコールバックをスレッドプールにディスパッチします。
メインスレッドはタイマータイムアウトも処理し、タイムアウトコールバックをスレッドプールにディスパッチします
I / Oコールバックでは、I / O処理の結果によっては、1つのタイマータスクがキャンセルされる場合があります。
1つのI/Oコールバックが実行されている間、対応するソケットはそれ以上の同一のイベントについて監視されません。
1つのタイマーコールバックが実行されている間、そのタイマータスクはタイマータスクキューから一時的に削除されます。
ここに問題があります:
プール内のスレッドAが、タイマーコールバックTを実行している間。
プール内のスレッドBは別のコールバック(ソケットI / O読み取りイベントに登録)を実行している可能性があります。受信した要求を処理した後、スレッドBはタイマータスクTを削除することを決定しますが、そのタイマータスクTは現在スレッドAによって実行されています。
タイマータスクのロックを追加できますが、どこにロックを配置すればよいですか?タイマータスク構造にロックオブジェクトを配置できません。タスクオブジェクトを解放することを決定したときに、ロックを取得している必要があります。ロックを解放して保持すると、未定義の動作が発生する可能性があります。
pthread_mutex_lock(T->mutex);
free(T);
/*without a pthread_mutex_unlock(T->mutex);*/
そして、別のスレッドがブロックされた場合はどうなりますか:
pthread_mutex_lock(T->mutex);
これらの問題に対処しないと、仕事を続けることはできません。助けてください!
単一のプロセスで異なるタイプのタスクに個別のスレッドプールを使用する必要がありますか?または、シングルスレッドを使用しますか?
どんな提案でも大歓迎です!