我有两个函数,比如 foo() 和 bar(),我希望它们互斥,即在 bar() 运行时完全阻止 foo() 的运行,或者在 foo 时完全阻止 bar() 的运行() 为线程安全而运行。
但是,我可能会在 foo() 中调用 bar(),即当 foo() 在 foo() 中调用 bar() 时,让 bar() 运行,但不让任何其他线程调用 bar()。
这可能吗?如果是,能否提供一下大概思路?
尝试在C中使用一个或多个互斥量,很容易使两个函数互斥,但我无法在foo()中调用bar(),它们会陷入死锁。
我不能在 foo() 中调用 bar() 之前就解锁互斥量,因为我不能保证下一个运行的 bar() 是在 foo() 中调用的那个。
我正在寻找一个解决方案,foo 会阻塞 bar,如果它们在不同的线程中运行,bar 也会阻塞 foo。但是当 foo 在它的体内(同一个线程)调用 bar 时,让 bar 运行。
谢谢
最佳答案
最简单的方法是将 bar()
和 foo()
的主要实现移动到单独的辅助函数 bar_unlocked()
和 foo_unlocked()
,然后将 bar()
和 foo()
实现为:
type foo(args)
{
type result;
pthread_mutex_lock(&barfoo_lock);
result = foo_unlocked(args);
pthread_mutex_unlock(&barfoo_lock);
return result;
}
type bar(args)
{
type result;
pthread_mutex_lock(&barfoo_lock);
result = bar_unlocked(args);
pthread_mutex_unlock(&barfoo_lock);
return result;
}
您可以在 foo_unlocked()
的实现中安全地调用 bar_unlocked()
。
关于c - 如果 bar() 和 foo() 互斥,如何在 foo() 中运行 bar(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56239472/