如果 bar() 和 foo() 互斥,如何在 foo() 中运行 bar()

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 运行。

谢谢

caf*_*caf 5

最简单的方法是移动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().