[晴]5時間くらいかかった。

今日はまった事。

std::vector<T>::beginで取得したiteratorのポインタが無効になる。

理由から書くと、iteratorはpush_backなどで要素を追加されない間しか保障されない。
シングルスレッドで作ってればこれは殆ど気にしなくていいんだけど、今回はマルチスレッドだった…。
メインスレッド側ではいつ追加されるか分からないため、子スレッド側でiteratorを使ってループしている最中にメインスレッドからpush_backで要素を追加されてしまうと、その時点で子スレッド側のiteratorが無効になってしまう。
ただ、子スレッド側は無効になったことは知らないから、例外を発生させる。

でだ、最終的にメインスレッドでいつpush_backを呼ばれるかわからないから、子スレッド側ではstd::vector<T>::at(index)で解決した。
これなら、iteratorを介さず直接内容を貰えるし、今回の実装はstd::vectorだからコピーじゃなくポインタを貰えるし。

ただ、実際のところat(index)の処理は、
return (begin() + index);
ってなってるんだけどね…。

コメントを残す

メールアドレスが公開されることはありません。