bthread API
这一次针对性的看看bthread.cpp这个文件的作用
主要是定义使用bthread的API的
这个之前提到过,是用来获取全局单例TaskControl的
用来设置最小的并发数量。可以看到当val大于当前的concurrency,也就是pthread worker数量的时候,我们就添加若干个worker来让他的并发数达到val
这个也提到过。start urgent会开始执行新的bthread,现有的bthread会被偷走
start background则是把bthread加入到任务队列中
flush的作用就是通知TaskGroup去执行这个bthread。
具体来说,task group在执行完bthread后会到parking lot中等待。而不是直接从队列中取任务。当我们通过TaskGroup调用flush nosignal tasks的时候,就会通知worker从parking lot中出来,然后开始执行bthread
主要作用其实在start from nonw worker中也说了。NOSIGNAL目的是批量创建bthread。这样我们都插入到队列中后,一次性signal,就可以都执行。(我怎么感觉这个机制用处不大?)
interrupt的作用是中断bthread的阻塞操作
实现的机制和butex有关,我们之后说
self的作用就是获取当前执行的bthread的tid
这里就是退出当前bthread的作用。通过抛异常
异常会在这里被捕捉到,以及他的返回值
bthread join是根据version来判断的。当完成bthread的时候我们会增加他的version butex。join中会等待这个version。直到他的version超过expected version为止。
is stopped的原理也是类系。如果当前的TaskMeta中存储的version和当前tid的version相同。说明这个bthread还没结束。那我们根据task meta中的信息来判断是否stop。否则的话说明这个bthread不存在。
这里和上面那个类似,就是设置并发数
usleep貌似比较复杂之后再看。但是行为来说的话和sys usleep是一样的
stop world用来停止掉所有的worker。他会终止掉所有阻塞的操作。然后join所有的pthread worker
后面的bthread list貌似也不见其他人用。所以就不看了。
基本上就是提供了和pthread类似的接口,只不过调度方面需要我们通过yield来让出CPU。
然后提供了中断阻塞操作的API。以及usleep。这两个应该是比较重要的。
文章评论