在开源的数据库中,支持并行建索引的,只有ingres,但它并不是并行建一个索引,而是对同一个表,同时并行建多个索引,
下面主要分析它如何协调主子线程通信部分,使用版本是 ingres-10.1.0-114-gpl;
并行建索引函数为:src/back/dmf/dmu/dm2upind.c STATUS dm2u_pindex( DM2U_INDEX_CB *index_cbs)
主子线程通信函数是 src/back/dmf/dmu/dm2uputi.c
DB_STATUS dm2u_pload_table(DM2U_MXCB *mxcbs, i4 *rec_cnt, DB_ERROR *dberr)
ingres是多线程,所以建索引的主线程和各个子线程是通过内存直接交换信息,没有通过共享内存;它由多个页面组成
DB_STATUS dm2u_pload_table(DM2U_MXCB *mxcbs, i4 *rec_cnt, DB_ERROR *dberr)
在子线程从交换页面读数据时,是互斥的,就是说同一时刻只有一个子线程读一个交换页面,不存在并发读
而在主线程写的时候,是没加互斥的,
一个写,多个读的时候,读之间互斥,写没加互斥,没写满之前,读不到
主线程放数据,子线程取数据的函数,没什么东西,主要是写满之后,取下一个页面的函数
实现了一个线程写,多个线程读,每个读线程读到全是一样的,