У меня есть две группы потоков A и B. Потоки в A выполняют функцию funA
, а потоки в B выполняют функцию funB
. Для потоков в каждой группе нормально выполнять свои функции одновременно, но funA
и funB
не должны выполняться одновременно. Как нам этого добиться? Есть ли у этой проблемы название, чтобы я мог прочитать о ней в Интернете?
Одно из возможных решений:
std::atomic<std::int64_t> counter{};
void funA() {
std::int64_t curr = 0;
while(
(curr=counter.load(std::memory_order_relaxed)) < 0 ||
!counter.compare_exchange_weak(curr,curr+1,std::memory_order_relaxed));
// implementation of funA goes here
counter.fetch_sub(1); // better to happen using RAII
}
void funB() {
std::int64_t curr = 0;
while(
(curr=counter.load(std::memory_order_relaxed)) > 0 ||
!counter.compare_exchange_weak(curr,curr-1,std::memory_order_relaxed));
// implementation of funB goes here
counter.fetch_add(1); // better to happen using RAII
}
Это правильно? Это лучшее, что мы можем сделать? Что мне не нравится в этом, так это то, что потоки в одной группе конкурируют друг с другом в этих циклах while.