- 论坛徽章:
- 0
|
首先谢谢版主的耐心解答,event type应该是下面这个结构
struct event_type
{
//同一类型的事件可以有多条正在执行或等待调度,但这些事件有相同的属性.
struct evtt_property property;
//空闲线程指针,分配线程给事件时,优先从这里分配
struct thread_vm *my_free_vm;
char *evtt_name; //事件类型允许没有名字,但只要有名字,就不允许同名
//如果一个类型不希望别的模块弹出事件,可以不用名字。
//如模块间需要交叉弹出事件,用名字访问。
//优先级小于0x80为紧急优先级,它影响虚拟机的构建.类型优先级在初始化时设定,
ufast_t default_prio; //事件类型优先级.不同于事件优先级,1~255,0非法.
uint16_t pop_sum,done_sum; //已弹出事件总数,已完成事件总数
uint16_t repeats; //未开始处理的该类型事件发生的次数
uint16_t vpus_limit; //本类型事件允许同时建立的线程虚拟机个数
uint16_t vpus; //本类型事件已经拥有的线程虚拟机个数
void (*thread_routine)(struct event_script *my_event);//函数指针,可能是死循环.
uint32_t stack_size; //thread_routine所需的栈大小
//mark_unclear指针指向mark型尚未被clear的事件。
//在pop一个mark型事件时,若队列中已经有该类型的、未被clear的事件,则只是增加
//该类型的repeats数,若又是参数替换型事件类型,替换事件参数。这种情况下,
//y_event_pop函数的参数prio是无效的。
//若该mark型事件没有未clear的事件,但仍有事件在处理,则新事件并不加入就绪
//队列,而是挂在mark_unclear指针下,待正在处理的事件done时把它加入就绪队列。
//若该mark型事件既无未clear的事件,又没有正在处理的事件,则直接加入就绪队列
//如果不是mark型事件,不使用本指针
struct event_script *mark_unclear;
//这两队列都是以剩余次数排队的双向循环链表
struct event_script *done_sync,*pop_sync;//弹出同步和完成同步队列头指针,
};
创建每个事件的时候,应该都有这个类型的返回值来标识。
我设想这样一种应用:假设我们需要对一个全局的链表频繁的进行添加和删除操作,add_req 和del_req应该是两类不同的时间,如果设置为同一类型的事件,我在这个结构中没有办法区分这两类不同的操作。
当然,有添加删除就有mod_req。
我们需要确保mod_req要执行的时候,del_req没有将要mod的节点删除,于是我们可以加锁保护,乍看上去是没有问题的,但是细考虑一下
假如我们这个链表需要频繁的大批量的添加删除和修改,长时间的lock住这个结构是不被接受的。
比如创建了1000个节点,然后要修改这1000个节点就要lock住整个链表,而这么长的时间里,我们都可能无法响应新的add或者del请求,这是不被接受的。
我的考虑是丰富event_type结构,同一event类型可以有不同的eventID,这样,可以根据ID的不同做不同的处理,在同一线程就比较容易避免这种问题了。 |
|