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