Мне известно, что мне нужно использовать мьютекс, когда я выполняю операции над одним контейнером STL внутри нескольких потоков. Однако я хочу знать, есть ли какие-либо исключения из этого правила. Пожалуйста, рассмотрите упрощенный сценарий, который я пытаюсь реализовать.
У меня есть несколько потоков, добавляющих элементы в контейнер, и операция окружена блокировкой / разблокировкой мьютекса. Затем потоки уведомляют каким-либо образом (например, используя eventfd на linux) отдельный поток, предназначенный для элементов отправки в этом контейнере. Я хочу получить доступ к первому элементу в контейнере без использования мьютекса. Пример кода на основе deque, но обратите внимание, что я могу использовать любой контейнер с возможностью очереди:
std::mutex locker;
std:deque<int> int_queue;
int fd; // eventfd
eventfd_t buffer;
bool some_condition;
Тема 1, 2, 3 и т. Д.
locker.lock ();
int_queue.push_back (1);
locker.unlock ();
eventfd_write (fd, 1);
Тема, посвященная элементам отправки:
while (true)
{
bool some_condition (true);
locker.lock ();
if (int_quque.empty () == false)
{
locker.unlock ();
}
else
{
locker.unlock ();
eventfd_read (fd, &buffer);
}
while (some_condition)
{
int& data (int_queue.front ());
some_condition = some_operation (data); // [1]
}
locker.lock ();
int_queue.pop ();
locker.unlock ();
}
[1] Я буду делать some_operation () для элемента signle много раз, поэтому здесь я хочу избежать блокировки мьютекса. Это дорого.
Я хочу знать, может ли этот код вызвать какие-либо проблемы с синхронизацией или что-то в этом роде.