如上图,我有一个大小为10的循环数组,有读和写两个索引(r|w),r不会越过w,从左至右只会读取r到w索引之间的数据,w会一直往前写入数据,写到第下标10就转到下标0继续写入,但w也不会越过r。
简而言之,只有w写入过数据的位置才能读,只有r读过的位置w才能重新写,两条线程分别控制r和w,如果我在准备读取数据前,先上锁,然后读取r到w之间的数据的个数,然后解锁,之后则把这些确定个数的数据进行处理,处理完成再上锁把r这个索引往前更新,标定为前面处理过的数据已使用,可以进行写入新数据。两条线程仅上锁确定索引然后解锁,它们操作的数据区域不在同一处,请问有何种漏洞吗?
我也可以这样做,做任何事情前先上锁,然后读取r的个数,然后处理完数据(耗时任务)再解锁,我是否有必要这样做呢?