C 锁内常量变量初始化
我需要使用lock保护常量变量的赋值或初始化。大概是这样的: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变
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(...);
}