由于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>
看起来很自然。
答案 0 :(得分:3)
如果略有异常,您使用std::atomic_flag
作为独立的互斥锁是正确的。
直接使用std::lock_guard
std::lock_guard
是不可能的,因为std::atomic_flag
模板管理互斥锁,而std::lock_guard
是(低级)原子布尔类型。
可以与lock
一起使用的互斥实现必须提供成员函数unlock
和class 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));