В общем std::forward_list
безопасно ли, чтобы несколько потоков вызывали insert_after
одновременно, если они гарантированно никогда не вызовут его с одним и тем же итератором позиции? Кажется, это может быть безопасно, учитывая, что вставка гарантированно не делает недействительными другие итераторы, а в контейнере нет метода size()
, но, может быть, я что-то упускаю?
Редактировать:
Я написал небольшую тестовую программу для пыток, которая отлично работает в Clang без каких-либо блокировок:
#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';
}
Я знаю, что это ничего не доказывает, но вселяет в меня надежду, что это безопасно. Я не уверен, что смогу использовать его без подтверждения стандарта.