System: Simple Beautiful Protection lock_guard

Sample

// Why Simple, Why Beautifu

#include <mutex>
#include <thread>

int g_var = 1;

std::mutex mtx;

static void thread_1_handler(void)
{
    {
        std::lock_guard<std::mutex> guard(mtx);
        g_var = 3;
    }
}

int main(void)
{
    {
        std::lock_guard<std::mutex> guard(mtx);
        g_var = 2;
    }

    std::thread thread_1(thread_1_handler);
    return 0;
}

How works

//use reference, and de-contructure when out of variable range
  
template<typename _Mutex>
    class lock_guard
    {
    public:
      typedef _Mutex mutex_type;

      explicit lock_guard(mutex_type& __m) : _M_device(__m)
      { _M_device.lock(); }

      lock_guard(mutex_type& __m, adopt_lock_t) noexcept : _M_device(__m)
      { } // calling thread owns mutex

      ~lock_guard()
      { _M_device.unlock(); }

      lock_guard(const lock_guard&) = delete;
      lock_guard& operator=(const lock_guard&) = delete;

    private:
      mutex_type&  _M_device;
    };

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`std::condition_variable_any`是一个通用的条件变量类,它可以与任何可锁定类型一起使用。`wait_until`是`std::condition_variable_any`类的一个成员函数,用于在指定的时间点等待条件变量。 `wait_until`函数的语法如下: ```cpp template<class Lockable, class Predicate> std::cv_status wait_until(Lockable& lock, const std::chrono::time_point<Clock, Duration>& abs_time, Predicate pred); ``` 参数解释: - `lock`:一个可锁定的对象,用于保护条件变量。 - `abs_time`:一个`std::chrono::time_point`类型的参数,表示等待的终止时间点。 - `pred`:一个可调用对象,用于检查条件是否满足。如果条件不满足,线程将一直等待。 `wait_until`函数的工作原理如下: 1. 线程调用`wait_until`函数并传入`lock`对象、终止时间点和条件检查函数。 2. 如果条件满足,`wait_until`函数立即返回`std::cv_status::no_timeout`。 3. 如果条件不满足,`wait_until`函数将线程置于等待状态,直到满足以下任一条件: - 终止时间点到达。 - 其他线程调用了与`condition_variable_any`对象关联的`notify_one`或`notify_all`函数。 - 线程被中断。 4. 如果线程被唤醒并且条件满足,`wait_until`函数返回`std::cv_status::no_timeout`。 5. 如果线程被唤醒但是终止时间点到达,`wait_until`函数返回`std::cv_status::timeout`。 下面是一个示例代码,演示了如何使用`wait_until`函数: ```cpp #include <iostream> #include <condition_variable> #include <mutex> #include <chrono> #include <thread> std::condition_variable_any cv; std::mutex mtx; bool ready = false; void worker() { std::this_thread::sleep_for(std::chrono::seconds(2)); std::unique_lock<std::mutex> lock(mtx); ready = true; cv.notify_one(); } int main() { std::unique_lock<std::mutex> lock(mtx); std::chrono::system_clock::time_point timeout = std::chrono::system_clock::now() + std::chrono::seconds(5); while (!ready) { if (cv.wait_until(lock, timeout) == std::cv_status::timeout) { std::cout << "Timeout occurred!" << std::endl; break; } } if (ready) { std::cout << "Condition satisfied!" << std::endl; } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值