锁内常量变量初始化

问题描述 投票:1回答:1

我需要使用锁来保护const变量的赋值或初始化。像这样的东西:

int device_write() {
/* ... */
lock (lock);
const int var = test_variable[INDEX];
/* ... */


...
/* var being used here sometime later*/

unlock(lock)
...
}

但是现在,编译器开始发出警告声明声明为after语句。因为const int var = ..声明位于spin_lock()之下。

var变量不是全局变量。

实际上,赋值的右边在实际代码中很大。因此,要先在名为var的变量中捕获该变量,然后在涉及var且具有各种位操作的复杂语句中使用它。这就是要求。不能更改

基本上在分配的右侧,由于并发/多线程,test_variable[..]容易出现竞争状态。因此,需要使用lock()进行保护。还有其他优雅的方法可以实现这一目标吗?

c linux locking mutex race-condition
1个回答
3
投票

您只需要将变量的定义与需要保护的写访问权限分开,特别是因为写到左侧(通过您自己的语句)的部分不是重点。为了确保变量不会从不一致的读取中获取值,就足以在锁内进行读取,而锁又不需要在初始化时进行读取,这使编译器很烦恼。

所以:

int some_function()
{
    /* ... */
    int nonconst = 0; /* no declaration is after statement */
    lock ( ...)
    nonconst = test_variable[INDEX]; /* only assignment, no declaration */
    /* ... */

    { /* start a new block to solve the compilers sequence complaint */
        const int var = nonconst; /* var itself is const */

      /* ... */
      /* var being used sometime later, no code can change var */
      /* changing the nonconst variable is possible, but does not affect
         the value of var anymore */
      /* ... */
    }
    unlock(...)
}

[上面是我的答案,请在下面找到一个更优雅的版本,我理解该版本是OP根据Adrian Mole的有见识的评论(我盲目地遗漏了……)和我的答案的结构得出的。如果Adrian或OP做出自己的回答并通知我,我将删除此部分。目前,它改善了这个答案,为他人带来了好处。

int some_function()
{
    /* ... */
    lock ( ...);

    { /* start a new block to solve the compilers sequence complaint */
        const int var = test_variable[INDEX]; /* var itself is const */

      /* ... */
      /* var being used sometime later, no code can change var */
      /* ... */
    }
    unlock(...);
}

我做了一些微小的编辑,以减少混乱和编译器警告。

© www.soinside.com 2019 - 2024. All rights reserved.