マルチスレッドが楽しい
「朔のアクセスがとんでもないことになっているらしい」の件ですけど、 一応解決できたみたいです。 以前は更新通知(/update命令)が来たとき、こんなことしてました:
- フラグが立ってたら待つ。待ってもフラグが立ったままなら終了。
- フラグが立ってなかったら立てる。
- 更新の処理をする。
- 処理に失敗したらフラグを降ろす。
どういうことかというと、作業中フラグと作業終了フラグが同じものだったんです。 なので、既に作業終了だから終わってよいのか、 作業中なのでそれが失敗したときのために待つべきなのか、 判断がつかなかったのです。 それで既に作業が終了しているときは50秒も待たせてました。
今はこんな感じです:
- 作業終了のフラグが立ってたら終了。
- そうでなければキューに入れて終了。
キューの仕事はこんな感じ:
- 更新の処理をする。
- 処理に成功したらフラグを立てる。
キューの仕事は更新通知が来たときと、あとは定期的に行われます。 これで待機スレッドの数は大幅に減ったはず。