LINUX.ORG.RU

Нужен ли insertAt в потокобезопасный контейнер?

 ,


0

2

http://threadingbuildingblocks.org/docs/help/reference/containers_overview/co...
В интелевском TBB у vector нет insert. Нужна ли вставка/удаление в произвольном месте в контейнере, который разрешает конкурентный доступ?
Допустим есть 2 потока, одновременно вставляющие после 1го элемента разные значения. Что должно быть результатом такой операции? Предлагайте свои варианты решения этого undefined behaviour.

Допустим есть 2 потока, одновременно вставляющие после 1го элемента разные значения.

Значит им должно быть пофиг, где окажется элемент. Значит insert не нужен.

ziemin ★★ ()

Нужна ли вставка/удаление в произвольном месте в контейнере, который разрешает конкурентный доступ?

А чего ты выиграешь, если не реализуешь вставку? Когда данные вырастут за пределы capacity контейнера, все равно придется делать перераспределение памяти и копировать все содержимое. Если это потокобезопасный (читай с внутренним механизмом синхронизации) контейнер, то проблемы конкурентной вставки не существует вообще, иначе требуется внешний механизм синхронизации, что тоже не мешает реализовать insert.

m0rph ★★★★★ ()
Последнее исправление: m0rph (всего исправлений: 1)
Ответ на: комментарий от ziemin

Типа push_back гарантирует что элемент будет вставлен, но возможно в любом месте контейнера. Тогда лучше бы назвали метод просто push или insert. Хотя там даже erase нету :\

nerdogeek ()
Ответ на: комментарий от m0rph

Допустим есть 2 потока, одновременно вставляющие после 1го элемента разные значения. Что должно быть результатом такой операции?

Вставка в iй позиции не гарантирует что элемент окажется на iй позиции. Значит элемент будет просто вставлен куда угодно в контейнере. Зачем тогда insertAt? Только лишь для частного случая однопоточного use-case?

nerdogeek ()
Ответ на: комментарий от nerdogeek

Типа push_back гарантирует что элемент будет вставлен, но возможно в любом месте контейнера

Нет. Он будет после всех, которые твой отдельный поток уже вставил.

ziemin ★★ ()

В чём проблема-то?

При InsertAt элемент будет вставлен не куда угодно, а в указанное место. Другое дело, что после вставки другой поток может что-то еще вставить и сместить элемент. Но он был вставлен куда надо.

Если нужно после вставки что-то успеть сделать, пока элемент не сместился, то вот алгоритм:

  1. Блокировать mutex
  2. Вставить элемент
  3. Делать что-то, что требует от элемента находиться в указанном месте
  4. Разблокировать mutex
kvap ()
Ответ на: комментарий от ziemin

Не факт, может быть одновременный поток который удалил все предыдущие, который «отдельный поток уже вставил».

nerdogeek ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.