std::forward_list
共有では、同じ位置イテレータで決して呼び出さないことが保証されている場合、複数のスレッドが同時にinsert_after
を呼び出すことは安全ですか?挿入が他のイテレータを無効にしないことが保証され、コンテナにはsize()
メソッドがありませんが、おそらく私は何かを見逃していることを考えれば、これは安全かもしれないようです。std :: forward_list :: insert_afterスレッドセーフ
編集:
私はロックせずにクランで正常に動作すると思われる小さな拷問テストプログラムを書いた:
#include <forward_list>
#include <iostream>
#include <thread>
#include <vector>
using List = std::forward_list<int>;
using It = List::const_iterator;
void insertAndBranch (List& list, It it, int depth)
{
if (depth-- > 0) {
It newIt = list.insert_after (it, depth);
std::thread thread0 ([&]{ insertAndBranch (list, it, depth); });
std::thread thread1 ([&]{ insertAndBranch (list, newIt, depth); });
thread0.join();
thread1.join();
}
}
int main()
{
List list;
insertAndBranch (list, list.before_begin(), 8);
std::vector<It> its;
for (It it = list.begin(); it != list.end(); ++it) {
its.push_back (it);
}
std::vector<std::thread> threads;
for (It it : its) {
threads.emplace_back ([&]{ list.insert_after (it, -1); });
}
for (std::thread& thread : threads) {
thread.join();
}
for (int i : list) {
std::cout << i << ' ';
}
std::cout << '\n';
}
私は、これは何も証明していませんが、それはこのように私が期待します知っています安全です。私は標準からいくつかの確認なしにそれを使用することができますか分からない。共有std::list
で
[std :: list threading push \ _back、front、pop \ _front]の可能な複製(http://stackoverflow.com/questions/1843567/stdlist-threading-push-back-front-pop-front) – peval27
複製物は古く、物事が変わった。 –
よく、OPはC++標準を指定していません。 – peval27