Back to TILs

C++ spinlock

Date: 2020-09-03Last modified: 2024-11-02

Table of contents

Não use essa abordagem a menos que saiba o que está fazendo, pode consumir 100% da CPU. Veja página 22 do livro Concurrency with Modern C++ do Rainer Grimm

class Spinlock {
  std::atomic_flag flag = ATOMIC_FLAG_INIT;

public:
  void lock()
  {
    while( flag.test_and_set() ) {
      // Apenas consome ciclos da CPU enquanto aguarda
    }
  }

  void unlock()
  {
    flag.clear();
  }
};
Spinlock spin;
void workOnResource()
{
  spin.lock();
  // shared resource
  std::this_thread::sleep_for( std::chrono::milliseconds( 2000 ) );
  spin.unlock();
}
int main()
{
  printf( "Spinlock\n" );
  std::thread t1( workOnResource );
  std::thread t2( workOnResource );

  t2.join();
  t2.join();
  return 0;
}

Possible output


References