Atomi c приращение, если неотрицательное, и atomi c уменьшение, если неотрицательное - PullRequest
0 голосов
/ 04 мая 2020

У меня есть две группы потоков 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.

...