Отличная условная блокировка в 2-х функциях

0

У меня есть 2 функции, используемые в многопоточной среде.

static std::vector<MyType> shared_resource;
void funcA(){
    // remove/add object to shared_resource
}

void funcB(){
    // Use shared_resource (but never changes it)
}

Я должен синхронизировать 2 функции, так что, хотя funcA работает на общем ресурсе, funcB ждет его. Одно очевидное решение - использовать критический раздел, но если я его использую, вызов функции funcB также сериализуется, и это то, чего я не хочу. Я имею в виду, что я хочу разрешить нескольким потокам выполнять funcB в одно и то же время, но как только funcA вызывается из другого потока, все потоки, входящие в funcB, блокируются, и после завершения потока выполнения funcB поток в funcA возобновляется и выполняется Это.

Я не знаю, ясно ли мое объяснение, поэтому я пишу пример. Предположим, что мы имеем поток T1-T5. И это ожидаемое поведение.

  1. T1 и T2 вступили в funcB и одновременно выполняли функцию funcB.
  2. T3 вводит funcA и ждет выхода T1 и T2 из funcB
  3. T4 вводит funcB, но поскольку T3 ожидает выполнения funcA, T4 блокируется исполнением funcB
  4. После выхода T1 и T2 T3 выполняет funcA
  5. T5 вводит funcB, но поскольку funcA все еще выполняется, он блокируется
  6. После того, как T3 выходит из funcA, T4 и T5 одновременно выполняют funcB.

Что я должен использовать для достижения такого поведения? Семафор? Я реализую его в среде Windows/C++.

Теги:
multithreading

1 ответ

4
Лучший ответ

Вы должны использовать так называемый lock-writer lock, wikipedia. Вы можете найти аа простую реализацию, используя Pthreads здесь.

  • 0
    Спасибо, это то, что я хочу знать!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню