http://www.1point3acres.com/bbs/thread-124049-1-1.html
设计一个task dispatching system,里面有一个task queue和两个function。并且这个queue的所有operation是atomic的。
1. trigger() 这个function运行并清空task queue中所有的tasks。
2. addTask(task) 在trigger之前把task加入task queue,在trigger之后直接运行task。
在mitbbs有一个被说不是最优解的解法,使用了一个全局布尔变量来判断queue是否已经被trigger。
我个人觉得queue是否被trigger的区别在于这个queue是否为空,因为queue被trigger后整个queue就空了,没有必要去增加一个全局变量。而且addTask()和trigger()应该是不冲突的,trigger()总是取queue最前面的一个task来run,而新的task总被加到queue的末尾,上面这样加锁system性能会很差。
以上是我的写法,这样加锁可以使queue不为空时,能够同时trigger和addTask。而且可以保证queue里的最后一个task被取出来后,总是能够在addTask(task)的task之前运行。
但是这样写有个bug就是当queue为空,多个addTask(task)被call,task永远没有办法被add进queue,会处于顺序执行状态。持有锁的那个addTask会run task。这样queue就失去了存在的意义。不知道我的写法应该怎么改进,求指导。
设计一个task dispatching system,里面有一个task queue和两个function。并且这个queue的所有operation是atomic的。
1. trigger() 这个function运行并清空task queue中所有的tasks。
2. addTask(task) 在trigger之前把task加入task queue,在trigger之后直接运行task。
在mitbbs有一个被说不是最优解的解法,使用了一个全局布尔变量来判断queue是否已经被trigger。
我个人觉得queue是否被trigger的区别在于这个queue是否为空,因为queue被trigger后整个queue就空了,没有必要去增加一个全局变量。而且addTask()和trigger()应该是不冲突的,trigger()总是取queue最前面的一个task来run,而新的task总被加到queue的末尾,上面这样加锁system性能会很差。
以上是我的写法,这样加锁可以使queue不为空时,能够同时trigger和addTask。而且可以保证queue里的最后一个task被取出来后,总是能够在addTask(task)的task之前运行。
但是这样写有个bug就是当queue为空,多个addTask(task)被call,task永远没有办法被add进queue,会处于顺序执行状态。持有锁的那个addTask会run task。这样queue就失去了存在的意义。不知道我的写法应该怎么改进,求指导。