1

我关注了以下网页:

http://www.1024cores.net/home/lock-free-algorithms/reader-writer-problem/improved-lock-free-seqlock

来源如下:

struct data_t 
{ 
    int seq; // sequence number 
    int data [1024]; // user data 
}; 

struct seqlock_t 
{ 
    data_t* current; 
    data_t pool [16]; // 16 user objects are held 
}; 

seqlock_t sl; 

结构很简单,让我困惑的是:

data_t* d0 = sl.current; // load-consume
int idx = (sl.current - sl.pool + 1) % 16; 
data_t* d = &sl.pool[idx]; 

sl.current一个指针,sl.pool是吗?current-pool 可以实现什么?鉴于c language此,我该如何解释这种说法?

int idx = (sl.current - sl.pool + 1) % 16;

编辑 :

感谢您提供所有信息,它有很大帮助!在我自己的编码风格中会使用 int idx = (sl.current - &[sl.pool[0]) + 1) % 16; 现在我知道 &(sl.pool[0]) 与 sl.pool 相同!我应该弄清楚,下面的例子,我之前读过的,显示指针/数组....

void display(int *p)
{
    int idx ;
    printf("(%d)(%d)\n",*p,p[1]) ;
}
int main()
{
    int i,Arr[10] ;
    for(i=0;i<10;i++)
        Arr[i] = i + 100;
    display(Arr) ;
}

是的,我可以使用 display(Arr) 和 display(&Arr[0]) ,它们是一样的~!!

4

3 回答 3

6

sl.current是一个指针。sl.pool是一个数组,这样写就等于&sl.pool[0]. 所以它指向数组的第一个元素。我们可以做一些指针操作,比如减法,这样就可以得到一些索引。

我发现这个链接http://www.eskimo.com/~scs/cclass/notes/sx10b.html很容易理解一些指针算法。

于 2013-10-22T09:12:45.443 回答
2
data_t* d0 = sl.current; // load-consume

获取指向局部变量甚至寄存器的指针,以便更容易访问。

int idx = (sl.current - sl.pool + 1) % 16; 

假设sl.current指向数组的元素之一sl.pool。所以sl.current - sl.pool得到相应的距离data_t *,所以它得到当前索引。+ 1前进到下一个索引,并与% 16您一起实现值 16(这将是非法的)指向 0。

data_t* d = &sl.pool[idx];

这指向新的;我想以后会出现一个 sl.current = d或类似的东西。

于 2013-10-22T09:28:56.897 回答
1

从我可以通过给定的信息推断:

int idx = (sl.current - sl.pool + 1) % 16; 
data_t* d = &sl.pool[idx]; 

s1.pool是一个数组。所以,否定s1.pool会给出一些价值,比如说int x。现在((x+1) % 16)将给出一个有效的数组绑定索引,s1.pool其存储在idx. 因此,他们为第二行处理找到了有效的数组索引。

于 2013-10-22T09:25:30.293 回答