こんにちは。
まず、「処理の生合成を取る」ってどのような意味でしょうか?
排他制御はスレッド間で同じリソースへの同時アクセスを制限するのに使われることが多いので、スレッド間の排他制御として回答します。もし、異なりましたら、「処理の生合成を取る」の意味を一般的な(ググったら出てくる程度に)用語にてご説明頂けると幸いです。
排他制御は、リソースをアクセスしている最中に他のスレッドが割り込むとまずいところを保護します。
例えば、ある変数の値が0なら++1して何かするような時、下記のようなコードを書くと思います。
C++
1if (!foo)
2{
3 ++foo;
4 do_something();
5}
この時、if (!foo)
の直後に他のスレッドが割り込んで同じ処理をすると、片方のスレッドは++foo;とdo_something();してほしくないに、両方が実行してしまいます。
これを防ぐために、if (!foo) {++foo;
の処理中に他のスレッドが割り込めないように排他制御します。
リストの場合はこの範囲がかなり広いです。リスト探索中に要素の追加/削除が行われると削除された要素をアクセスしたり、追加中でまだ設定されていないポインタを追跡したりと悲惨ですね。ですので、リストをアクセスする処理全体を排他制御する必要があります。(ピンポイントで排他制御しても、屋根に登ったあとから、ハシゴを外される状態になってしまいます。)
排他制御している部分は当たり前ですが、並列処理できないので、折角マルチスレッドで性能を確保しようとしていることが無駄になりかねません。ですので、排他制御は最低限で済むよう工夫することが重要です。
そもそもスレッドは使わないのが一番なのです。それではどうしても性能不足する場合に、最低限どの部分を排他制御する必要があるのかよく見極め、その排他制御期間を許容してもマルチ・スレッド化した方が性能を改善できる目処がある時に初めて検討します。
ですので、まずはtoma_kazusaさんのアプリをマルチ・スレッド化する必要性を検討されることをお薦めします。
またシグナルを実行しているのですが、その結果によってリストをいじる関数が呼ばれる可能性があります。よってそのシグナルを一時的にブロックすることもできるのでしょうか?
たぶん、シグナル・ハンドラーからリストをアクセスするという意味ですね?
であれば、シグナルは待ち行列を持ってないので待たせられないですし、シグナル・ハンドラーはちょっと特殊ですが一種のスレッドですから上記回答に準じます。本当にシグナル・ハンドラーを使わないとできない処理なのか検討されることをお薦めします。
(実は、他のtoma_kazusaさんの質問から、シグナル・ハンドラーを使う必要がないだけでなく、そもそもシグナル・ハンドラーではできないだろうと予想しています。恐らく、複数クライアントからのUDP受信待ちタイムアウト時にそのクライアントの識別情報をリストから削除したいのですよね?)