ypipe_t源代码续
inline bool unwrite (T *value_)
{
if (f == &
queue.back ())
return false;
queue.unpush ();
*value_ =
queue.back ();
return true;
}
inline bool flush ()
{
if (w == f)
return true;
if (c.cas (w, f) != w) {
c.
set (f);
w = f;
return false;
}
w = f;
return true;
inline bool check_read ()
{
if (&
queue.front () != r && r)
return true;
r = c.cas (&
queue.front (), NULL);
if (&
queue.front () == r || !r)
return false;
return true;
}
inline bool read (T *value_)
{
if (!check_read ())
return false;
*value_ =
queue.front ();
queue.pop ();
return true;
}
4. 过程分析 分析完了ypipe_t及其关联数据结构的源代码,下面通过图形展示一下各种操作的内存变动图。 4.1 yqueue_t初始化完成后的内存布局如下图所示。 4.2 ypipe_t初始化完成后内存布局如下图所示。 4.3 ypipe_t::write()写入一个元素,这个元素分为三个片段A,B, C写入,A,B的incomplete_为true,C的incomplete_为false导致整个元素被flush。 4.4 ypipe_t::flash()把元素刷新到队列中(也就是flash()之后此元素就被读线程可见了。) 4.5 ypipe_t::check_read()更新了r指针到新的第一个不可读位置。 4.6 调用三次ypipe_t::read()函数分三次读取了A,B,C。读取之后的内存布局如下图所示。
转载请注明原文地址: https://ju.6miu.com/read-671147.html