- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
使用 GCC 4.8.2(在 Linux/Debian/Sid 64 位上)-或 GCC 4.9(如果可用)-在 C++11 中-我有一些互斥体
std::mutex gmtx;
实际上,它是某个类 Foo
中的 static
成员,其中包含 alpha
和 beta
方法如下。
它被锁定在 alpha
之类的
void alpha(void) {
std::lock_guard<std::mutex> g(gmtx);
beta(void);
// some other work
}
我想检查 beta
确实 gmtx
已锁定:
void beta(void) {
assert (gmtx.is_locked());
// some real work
}
(注意 is_locked
只在 assert
内部被调用...它可能非常低效甚至有时不准确)
当然,我还有其他调用beta
的函数,例如
void gamma(void) {
std::lock_guard<std::mutex> g(gmtx);
beta();
// some other work
}
但是is_locked
不存在....我应该如何定义它? (实际上我想确保互斥锁已被某些 [indirect] 调用者锁定在同一个线程中......)
(我想用 assert
测试的原因是 beta
可以在别处调用)
我不能使用 try_lock
(除非使用递归互斥锁),因为在常见的情况下它会锁定一个已经锁定的互斥锁...(被调用者锁定在同一个线程中)而这不是只有未定义的行为,但完全阻止。
我想避免递归互斥锁(比普通互斥锁更昂贵),除非我真的必须这样做。
注意:真正的程序有点复杂。实际上,所有方法都在一个类中,该类在“项目”上保持命名双向关系。所以我在那个类里面有一个从项目到名称的映射和另一个从名称到项目的映射。 beta
将是添加真正命名的内部方法,而 alpha
和 gamma
将是通过名称查找或添加项目的方法, 或其项目的名称。
PS:真正的程序还没有发布,但应该成为MELT的一部分- 它的 future monitor ;您可以从 here 下载它(alpha 阶段,非常有问题) (临时位置)
最佳答案
严格来说,问题是关于直接检查 std::mutex
的锁定性。但是,如果允许将其封装在新类中,则很容易做到:
class mutex :
public std::mutex
{
public:
#ifndef NDEBUG
void lock()
{
std::mutex::lock();
m_holder = std::this_thread::get_id();
}
#endif // #ifndef NDEBUG
#ifndef NDEBUG
void unlock()
{
m_holder = std::thread::id();
std::mutex::unlock();
}
#endif // #ifndef NDEBUG
#ifndef NDEBUG
/**
* @return true iff the mutex is locked by the caller of this method. */
bool locked_by_caller() const
{
return m_holder == std::this_thread::get_id();
}
#endif // #ifndef NDEBUG
private:
#ifndef NDEBUG
std::atomic<std::thread::id> m_holder;
#endif // #ifndef NDEBUG
};
注意以下几点:
std::mutex
的开销为零,但构造/销毁可能除外(这对于互斥对象来说不是问题)。m_holder
成员只能在获取互斥体和释放它之间访问。因此,互斥体本身充当m_holder
的互斥体。由于对 std::thread::id
类型的假设非常弱,locked_by_caller
将正常工作。std::lock_guard
是模板,因此它们与这个新类配合得很好。关于c++ - 如何断言 std::mutex 是否被锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21892934/
我有以下实体字段: /** * @Assert\Regex( * pattern = "/^d+\.(jpg|png|gif)$/", * htmlPattern = "/^d+\.(j
我有一个显示查询结果的表。 我使用这个检查表包含结果: cy.get("table", {timeout: 60000}).find("tr[data-index]").should("have.le
void (assert)(int e) { assert(e); } 这里是如何工作的? 最佳答案 void (assert)(int e) 相当于 void assert(int) 为什么
大家好,我的第一次测试遇到了一些问题 我正在写这个 fragment ,但我一直遇到这个问题: java.lang.AssertionError at org.junit.Assert.fail(As
从表中,我获取字符串列表,并想检查当 val!= "A"时,表列表中是否存在字符串“x”: for (int i = 0; i list = new ArrayList(); for(int i=0
我想在现有代码中为 VHDL 断言操作添加一个错误计数器。基本上,我的代码如下所示: assert data = good_data report "Bad data" severity er
我有一个无法处理的问题,所以我想也许你可以帮助我。基本上我有一个函数,它接收 char* 作为参数并对其执行一些操作(我已经检查了这些步骤/函数,它们工作得很好)。如果函数中给出的 char* 是“”
我有一些代码用于检查输入日期是否正确。只需检查是否不超过 12 个月,给定月份中的日期是否正确,并且还应该考虑闰年(因此,基本上是正常的日期检查)。唯一不合适的是年份不应低于 2000。如果日期无效,
我有一个关于 Cypress 断言的问题,最近才开始使用这个测试平台,但是当 URL 返回一个随机数时卡住了,如下所示。 /Geocortex/Essentials/REST/sites/SITE?f
我有一个 Python mock对象,我想断言是否设置了该对象的任何属性。 我不相信PropertyMock将适用于我的目的,因为我必须知道是否设置了任何属性,而不是特定属性。 它也不像我可以模拟模拟
考虑这个简单的基类 Foo 有一个函数 foo 调用一个纯虚函数 foo_,用 Doxygen 记录: class Foo { public: /** \brief This functi
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我在这段代码中执行 malloc 时遇到问题, /*function starts*/ if(NULL==(partial_results=(bignum_t**)malloc(sizeof
大家好,我想知道如何将整个代码块放入一个断言中? 例如,我有一个数组,我想对数组的每个值进行断言。这是我的代码的样子: for (int value : values) { assert Wi
这不是我的作业——我只是在练习。我似乎无法完全理解这个断言概念。 1) Determine the pre-condition for x that guarantees the post-condi
是否可以在带有时间戳的断言失败时记录信息 例如 int a = 10 assert( a > 100 ); 那么它将失败并像时间戳一样输出 2013-12-02 , 17:00:05 assert f
由于我们公司不使用单元测试,所以我正在自学对自己的代码进行单元测试。我正在使用标准的 .net 测试框架进行一些非常基本的单元测试。 我的一个方法返回一个 IEnumerable我想测试它的输出。所以
我有一个如下所示的对象数组,并且只想针对数组中的某些字段进行断言。 对象数组 - var a = [{"key":"key2","value":"value2","updatedBy":"name1"
我正在尝试编写一个 PSL 断言来检查输入断言的数量是否与输出断言的数量相匹配。 例如: . 在输入上任何时候都可能发生任何事情,输出也可以在任何时候断言。确切时间未知,也不重要。我要验证的是没有信息
我想在Cypress中做一个断言如下: cy.get(a).should('be.visible').or(()=>{ cy.get(b).should('be.visible'); });
我是一名优秀的程序员,十分优秀!