代码拉取完成,页面将自动刷新
#pragma once
#include <atomic>
#define _TICKET_SPIN
name px
{
class _TICKET_SPIN CSpinLock
{
#if 0
union Ticket
{
unsigned int used = 0;
struct
{
unsigned short _tickets;
unsigned short _users;
};
};
Ticket m_ticket;
#endif
std::atomic<unsigned short> m_users;
unsigned short m_ticket;
public:
CSpinLock() : m_users(0), m_ticket(0) {}
CSpinLock(const CSpinLock&) = delete;
CSpinLock& operator=(const CSpinLock&) = delete;
public:
void lock()
{
unsigned short _this = m_users.fetch_add(1, std::memory_order_acquire);
while (_this != m_ticket)
{
std::atomic_thread_fence(std::memory_order_acquire);
}
}
void unlock()
{
++m_ticket;
std::atomic_thread_fence(std::memory_order_release);
}
};
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。