可以在互斥锁解锁和从函数返回之间发生竞争条件

时间:2016-12-14 22:43:46

标签: c multithreading mutex

我一直在学习多线程应用程序,特别是关于如何使用互斥锁来防止竞争条件。但是,在编写一些代码时,我在代码中发现了竞争条件(使用@Service @ConditionalOnProperty(prefix="my.property" , name = "enabled", havingValue = "true") public class MyService { } 中的helgrind工具),我相信在解锁之后和返回之前,一个线程中的执行可能会暂停。

如果我们采用下面的示例代码,是互斥锁解锁和返回语句之间的竞争条件吗?如果是这样,我们如何解决这个问题呢?(不要求调用者传入某种缓冲区并返回一个常量值,如valgrind

0

注意:我知道在上面的例子中,返回' x'没用,因为x是全局的。但是,在一个图书馆中,' x'需要对库函数是全局的,但不能向用户公开,返回值变得很重要。

1 个答案:

答案 0 :(得分:7)

以下是当前代码中的事件序列:

  1. 解锁。
  2. 阅读共享的x变量。
  3. 返回您阅读的值。
  4. x的阅读完全没有受到保护。

    您需要做的是

    1. 阅读共享的x变量。
    2. 解锁。
    3. 返回您阅读的值。
    4. 以便锁定保护读取。为此,在解锁锁之前将x的值存储到非共享(本地)变量,并将其用作返回值:

      int retval = x;
      pthread_mutex_unlock(&mutex);
      return retval;