吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1131|回复: 4
收起左侧

[C&C++ 原创] 利用C++11及其以上标准,封装自旋锁

[复制链接]
licks 发表于 2023-11-30 16:42
本帖最后由 wushaominkk 于 2023-12-1 09:17 编辑

[C++] 纯文本查看 复制代码
[i]/************************************************************************
[/i][i]SpinLockTAS<> sp_lock;
[/i][i]std::unique_lock<SpinLockTAS<>> lk(sp_lock);
[/i][i]功  能:[/i][i] TAS[/i][i]自旋锁[/i][i]
[/i][i]返回值:[/i][i]void
[/i][i]************************************************************************/
[/i]template<::std::size_t sleepWhenLockFailedInMicroSecond = ::std::size_t(-1)>
class SpinLockTAS
{
public:
    void lock();
    void unlock();
private:
    ::std::atomic_flag locked_flag = ATOMIC_FLAG_INIT;
};

[i]/************************************************************************
[/i][i]SpinLockCAS<> sp_lock;
[/i][i]std::unique_lock<SpinLockCAS<>> lk(sp_lock);
[/i][i]功  能:[/i][i] CAS[/i][i]自旋锁[/i][i]
[/i][i]************************************************************************/
[/i]template<::std::size_t sleepWhenLockFailedInMicroSecond = ::std::size_t(-1)>
class SpinLockCAS
{
public:
    void lock();
    void unlock();

private:
    ::std::atomic<bool> locked_flag;
};

template<::std::size_t sleepWhenLockFailedInMicroSecond>
void SpinLockTAS<sleepWhenLockFailedInMicroSecond>::lock()
{
   while (this->locked_flag.test_and_set())
   {
       if (sleepWhenLockFailedInMicroSecond <= ::std::size_t(0))
           ::std::this_thread::yield();
       else if (sleepWhenLockFailedInMicroSecond > 0)
           ::std::this_thread::sleep_for(::std::chrono::microseconds(sleepWhenLockFailedInMicroSecond));
   }
}

template<::std::size_t sleepWhenLockFailedInMicroSecond>
void SpinLockTAS<sleepWhenLockFailedInMicroSecond>::unlock()
{
   this->locked_flag.clear();
}

template<::std::size_t sleepWhenLockFailedInMicroSecond>
void SpinLockCAS<sleepWhenLockFailedInMicroSecond>::lock()
{
    bool expect = false;

    while (!this->locked_flag.compare_exchange_weak(expect, true))
    {
       expect = false;
       if (sleepWhenLockFailedInMicroSecond <= ::std::size_t(0))
           ::std::this_thread::yield();
       else if (sleepWhenLockFailedInMicroSecond > 0)
           ::std::this_thread::sleep_for(::std::chrono::microseconds(sleepWhenLockFailedInMicroSecond));
    }
}

template<::std::size_t sleepWhenLockFailedInMicroSecond>
void SpinLockCAS<sleepWhenLockFailedInMicroSecond>::unlock()
{
    this->locked_flag.store(false);
}

免费评分

参与人数 1吾爱币 +5 热心值 +1 收起 理由
苏紫方璇 + 5 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

苏紫方璇 发表于 2023-11-30 22:09
推荐使用这个帖子的代码插入方法
【公告】发帖代码插入以及添加链接教程(有福利)
https://www.52pojie.cn/thread-713042-1-1.html
(出处: 吾爱破解论坛)
FruitBaby 发表于 2023-12-2 18:39
 楼主| licks 发表于 2023-12-5 23:18
苏紫方璇 发表于 2023-11-30 22:09
推荐使用这个帖子的代码插入方法
【公告】发帖代码插入以及添加链接教程(有福利)
https://www.52pojie. ...

我得研究研究,平时工作太忙
xuebing1995 发表于 2023-12-14 09:34
支持新人
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 17:38

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表