Size: a a a

2021 July 03

NK

Nikolay Kononov in C++ Together 2.0
class Mutex {
public:
 void Lock() {
   for (std::size_t i = 0; locked_.load() || locked_.exchange(1); i++) {
     if (i > 100) {
       i = 0;
       waiters_cnt_.fetch_add(1);
       locked_.wait(1);
       waiters_cnt_.fetch_sub(1);
     }
   }
 }

 void Unlock() {
   locked_.store(false);
   if (waiters_cnt_.load() > 0) {
     locked_.notify_one();
   }
 }

private:
 twist::stdlike::atomic<std::uint32_t> waiters_cnt_{0};
 [[maybe_unused]] char padding1_[60];
 twist::stdlike::atomic<std::uint32_t> locked_{0};
 [[maybe_unused]] char padding2_[60];
};
источник

NK

Nikolay Kononov in C++ Together 2.0
типа такого например
источник

RM

Roy Mustang in C++ Together 2.0
аа это вообще с осью не связано
источник

NK

Nikolay Kononov in C++ Together 2.0
ну тут операционные системы непричем
источник

RM

Roy Mustang in C++ Together 2.0
понятно
источник

NK

Nikolay Kononov in C++ Together 2.0
я тебя поэтому поправил немного
источник

NK

Nikolay Kononov in C++ Together 2.0
class TicketLock {
 using Ticket = size_t;

public:
 void Lock() {
   const Ticket this_thread_ticket = next_free_ticket_.fetch_add(1);

   while (this_thread_ticket != owner_ticket_.load()) {
   }
 }

 bool TryLock() {
   auto owner = owner_ticket_.load();
   return next_free_ticket_.compare_exchange_strong(owner, owner + 1);
 }

 void Unlock() {
   owner_ticket_.fetch_add(1);
 }

private:
 twist::stdlike::atomic<Ticket> next_free_ticket_{0};
 twist::stdlike::atomic<Ticket> owner_ticket_{0};
};
источник

NK

Nikolay Kononov in C++ Together 2.0
попробуй такой спинлок
источник

NK

Nikolay Kononov in C++ Together 2.0
с падингами
источник

NK

Nikolay Kononov in C++ Together 2.0
между тикетами
источник

NK

Nikolay Kononov in C++ Together 2.0
он защищает от старвейшена
источник

NK

Nikolay Kononov in C++ Together 2.0
что один поток будет бесконечно ждать потому что лок быстрее всегда захватывают
источник

M

Matrix Telegram Brid... in C++ Together 2.0
internet1: 0/ может кто нубасу подсказать по вызову деструкторов? (Скину демо-код)
источник

G

GNU/Плюшка in C++ Together 2.0
источник

M

Matrix Telegram Brid... in C++ Together 2.0
internet1:
code
источник

RM

Roy Mustang in C++ Together 2.0
Хуйня
источник

RM

Roy Mustang in C++ Together 2.0
Уступает мьютексу
источник

RM

Roy Mustang in C++ Together 2.0
Прикол в том, что я не могу провести бенчмарк нормально
источник

RM

Roy Mustang in C++ Together 2.0
из-за того что у меня в деструкторе пула срабатывает выход потока
источник

RM

Roy Mustang in C++ Together 2.0
а если его убрать, то я никогда не получу результаты
источник