SizedQueue
class SizedQueue
父:对象
这个类代表指定容量的队列。如果容量已满,推送操作可能会被阻止。
有关SizedQueue如何工作的示例,请参阅Queue。
公共类方法
new(max) Show source
创建最大尺寸为的固定长度队列max
。
static VALUE
rb_szqueue_initialize(VALUE self, VALUE vmax)
{
long max;
max = NUM2LONG(vmax
if (max <= 0) {
rb_raise(rb_eArgError, "queue size must be positive"
}
RSTRUCT_SET(self, QUEUE_QUE, ary_buf_new()
RSTRUCT_SET(self, QUEUE_WAITERS, ary_buf_new()
RSTRUCT_SET(self, SZQUEUE_WAITERS, ary_buf_new()
RSTRUCT_SET(self, SZQUEUE_MAX, vmax
return self;
}
公共实例方法
<<(*args)
别名为:推送
clear() Show source
从队列中删除所有对象。
static VALUE
rb_szqueue_clear(VALUE self)
{
rb_ary_clear(GET_QUEUE_QUE(self)
wakeup_all_threads(GET_SZQUEUE_WAITERS(self)
return self;
}
关闭显示源代码
与队列#关闭类似。
不同之处在于等待排队线程的行为。
如果有等待排队的线程,则通过引发ClosedQueueError('队列关闭')来中断它们。
static VALUE
rb_szqueue_close(VALUE self)
{
return queue_do_close(self, TRUE
}
deq(*args)
别名为:pop
enq(*args)
别名为:推送
max() Show source
返回队列的最大大小。
static VALUE
rb_szqueue_max_get(VALUE self)
{
return GET_SZQUEUE_MAX(self
}
max=(number) Show source
将队列的最大大小设置为给定值number
。
static VALUE
rb_szqueue_max_set(VALUE self, VALUE vmax)
{
long max = NUM2LONG(vmax), diff = 0;
VALUE t;
if (max <= 0) {
rb_raise(rb_eArgError, "queue size must be positive"
}
if ((unsigned long)max > GET_SZQUEUE_ULONGMAX(self)) {
diff = max - GET_SZQUEUE_ULONGMAX(self
}
RSTRUCT_SET(self, SZQUEUE_MAX, vmax
while (diff-- > 0 && !NIL_P(t = rb_ary_shift(GET_SZQUEUE_WAITERS(self)))) {
rb_thread_wakeup_alive(t
}
return vmax;
}
num_waiting() Show source
返回在队列中等待的线程数。
static VALUE
rb_szqueue_num_waiting(VALUE self)
{
long len = queue_num_waiting(self) + szqueue_num_waiting_producer(self
return ULONG2NUM(len
}
pop(non_block=false) Show source
deq(non_block=false)
shift(non_block=false)
从队列中检索数据。
如果队列为空,则将调用线程挂起,直到将数据推入队列。如果non_block
为真,该线程不会被挂起并被ThreadError
提升。
static VALUE
rb_szqueue_pop(int argc, VALUE *argv, VALUE self)
{
int should_block = queue_pop_should_block(argc, argv
return szqueue_do_pop(self, should_block
}
还有别名:deq,shift
push(object, non_block=false) Show source
enq(object, non_block=false)
<<(object)
推object
入队列。
如果队列中没有剩余空间,则等待空间变为可用,除非non_block
为真。如果non_block
为真,该线程不会被挂起并被ThreadError
提升。
static VALUE
rb_szqueue_push(int argc, VALUE *argv, VALUE self)
{
struct waiting_delete args;
int should_block = szqueue_push_should_block(argc, argv
args.waiting = GET_SZQUEUE_WAITERS(self
args.th = rb_thread_current(
while (queue_length(self) >= GET_SZQUEUE_ULONGMAX(self)) {
if (!should_block) {
rb_raise(rb_eThreadError, "queue full"
}
else if (queue_closed_p(self)) {
goto closed;
}
else {
rb_ary_push(args.waiting, args.th
rb_ensure(queue_sleep, Qfalse, queue_delete_from_waiting, (VALUE)&args
}
}
if (queue_closed_p(self)) {
closed:
raise_closed_queue_error(self
}
return queue_do_push(self, argv[0]
}
另外别名为:enq,<<
shift(*args)
别名为:pop