B.H*_*ong 0 c multithreading synchronization pthreads thread-safety
我有两个函数,比如 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()
and的主要实现foo_unlocked()
,然后实现bar()
andfoo()
为:
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;
}
Run Code Online (Sandbox Code Playgroud)
您可以安全地bar_unlocked()
从foo_unlocked()
.