std :: atomic_flag和std :: lock_guard

时间:2017-04-21 15:11:19

标签: c++11 locking atomic

由于std::lock_guard无法与std::atomic_flag合作,我已经实施了自己的版本:

class atomic_guard {
public:
    inline atomic_guard(std::atomic_flag& lock) : lock(lock) {
        while (this->lock.test_and_set()) {
            /* spin */ 
        };
    };

    inline ~atomic_guard() {
        this->lock.clear();
    };

private:
    std::atomic_flag& lock;
};

这似乎工作正常。问题是:这是为std::atomic_flag实施RAII的正确方法吗?还有一个内置的守卫吗?如果没有,为什么?专业化std::lock_guard<std::atomic_flag>看起来很自然。

1 个答案:

答案 0 :(得分:3)

如果略有异常,您使用std::atomic_flag作为独立的互斥锁是正确的。

直接使用std::lock_guard std::lock_guard是不可能的,因为std::atomic_flag模板管理互斥锁,而std::lock_guard是(低级)原子布尔类型。

可以与lock一起使用的互斥实现必须提供成员函数unlockclass my_mutex { std::atomic_flag flag{ATOMIC_FLAG_INIT}; public: void lock() { while (flag.test_and_set()); } void unlock() { flag.clear(); } }; ,并且可以像这样实现:

std::lock_guard

请注意,这是一个非常基本且效率低下的互斥锁实现,但它与my_mutex mtx; std::lock_guard<my_mutex> lck{mtx}; 兼容:

<?php
$string='JUD. NEAMT, SAT ROMEDC ALEXANDRE COM. COMENKA, STR. EXAMMS RANTEM, NR.6';
$result=preg_split("/(?:JUD.\s*|\s*SAT\s*|\s*COM\.\s*|\s*STR.\s*|\s*SECTOR\s*|\s*B-DUL\s*|\s*NR\.\s*|\s*ET.\s*|\s*MUN\.\s*|\s*BL.\s*|\s*SC\.\s*|\s*AP\.\s*)/", $string);

array_walk($result,function($value,$key) use (&$result){
    if(stristr($value, ","))
    {
        $result[$key]=explode(",", $value)[0];
    }
});
print_r(array_filter($result));
相关问题