小编Fra*_*e_C的帖子

位域附近的变量会损坏吗?

我面临的问题与Linux内核社区所描述的问题非常相似- 由位域背叛

问题的实质在于,GCC发出64位读取访问以访问偶数1位位域。这会导致读取相邻字段的意外副作用,而该副作用可在程序的其他位置进行修改。当回写修改后的位域值时,相邻变量的旧值也会被回写,从而丢失其他线程对其所做的任何修改。

我的问题略有不同。我有这样的课程/结构-

class Group {

    uint8 adjVariable;
    volatile bool  flag1: 1;
    volatile bool  flag2: 1;
    // so on...
    volatile bool  flag10: 1;
};
Run Code Online (Sandbox Code Playgroud)

访问这些变量的方式是-

Group::fun() {
    Group_Scoped_lock();
    // adjVariable was 12 here.
    if ( adjVariable > 0 ) {
        adjVariable = 0; // <------- EXPLICIT ZERO ASSIGNMENT
    }
    // some code that doesn't affect adjVariable 
    bool1 = false;
    bool2 = false;
    bool3 = false;
    assert( adjVariable == 0 ); // <---- This assert is tripping stating that adjVariable …
Run Code Online (Sandbox Code Playgroud)

c++ linux multithreading gcc

5
推荐指数
1
解决办法
155
查看次数

在没有语法错误的情况下,此代码中的if情况不起作用

if(s.name=="kolkata")      
{
    printf("the details");
}
if(strcmp((s.name,"kolkata")==0) 
{
    printf("the details");
}
Run Code Online (Sandbox Code Playgroud)

第一个"if"情况没有语法错误仍然无法正常工作,而第二个"if"情况确实非常有效,为什么?

c string strcmp equality-operator

-1
推荐指数
1
解决办法
71
查看次数

标签 统计

c ×1

c++ ×1

equality-operator ×1

gcc ×1

linux ×1

multithreading ×1

strcmp ×1

string ×1