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

标签 c multithreading synchronization thread-safety pthreads

我有两个函数,比如 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/

相关文章:

c# - 调用事件时,事件是阻塞还是非阻塞?

ios - 解析函数 `findObjectsInBackgroundWithBlock:` 检索部分数据库对象,但不是全部

java - Servlet 和同步

c - 子进程出错并等待 `C`

c - C 中用于替换另一个宏中的参数的宏

c - 声明大数组时出现堆栈溢出异常

C:已完成 Tic Tac Toe 程序,正在寻找改进的技巧

c++ - 移动构造函数是否使 shared_from_this 无效

java - wait() 是否需要局部变量同步

mysql - 帮助快速而肮脏的数据库同步解决方案