Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 锁内常量变量初始化_C_Linux_Locking_Mutex_Race Condition - Fatal编程技术网

C 锁内常量变量初始化

C 锁内常量变量初始化,c,linux,locking,mutex,race-condition,C,Linux,Locking,Mutex,Race Condition,我需要使用lock保护常量变量的赋值或初始化。大概是这样的: int device_write() { /* ... */ lock (lock); const int var = test_variable[INDEX]; /* ... */ ... /* var being used here sometime later*/ unlock(lock) ... } 但现在编译器开始发出警告,声明在语句之后。因为const int var=..声明在spin_lock()下面 var变

我需要使用lock保护常量变量的赋值或初始化。大概是这样的:

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


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

unlock(lock)
...
}
但现在编译器开始发出警告,声明在语句之后。因为
const int var=..
声明在spin_lock()下面

var
变量不是全局变量

实际上,赋值的右边在实际代码中相当大。因此,我们希望捕获名为var的变量中的第一个变量,并在以后的复杂语句中使用它,该语句涉及具有各种位操作的var。这就是要求。这是无法改变的

基本上,在赋值的右侧,
test\u变量[…]
由于并发/多线程,容易受到竞争条件的影响。因此,需要一个锁()进行保护。
有没有其他优雅的方法来实现这一点?

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

因此:

以上是我的答案,请在下面找到一个更优雅的版本,据我所知,这是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(...);
}

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

你可以把整个代码放在一个新的范围内,把它放在
{…}
大括号中,把它放在
解锁
之间。现在我想知道你为什么要这样做,为什么你认为有必要这样做。请解释一下。如果局部变量的初始化(您知道它仍然不是写访问)没有受到保护,那么可能会出现什么问题?可以演示可能正在运行和访问该测试变量的其他上下文吗?而不是向我们展示伪代码(即,
lock(…)
)向我们展示一些真实的代码,这些代码展示了您遇到的问题。除非我们确切地知道你给了它什么,否则我们无法告诉你编译器在抱怨什么。@NeedSomeLuck伪代码在编译器警告/错误方面是无用的。请使用其他人可以用来查看您的问题的更新问题,否则该问题将因缺少信息而关闭。@Yunnosch不是问题!但我很感激你的通知——良好的传统礼仪总是受欢迎的。但通过这样做,变量变得非常量——无法做到这一点。变量必须保持不变。啊,好的。。我很高兴讨论哪些部分需要保护,但我认为这涵盖了你的需要。你的答案很好。。。我只想指出,这可以在不创建新变量的情况下完成。不是吗?噢,天哪。在你指出之前,我没有意识到那句话的意思。。。使我失明。去请求原谅。。。
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(...);
}