不理解为什么不会有线程安全问题
来源:8-10 监听etcd中的强杀任务通知
memory0572
2019-05-02
课程中的Scheduler使用到了2个map,分别是
jobPlanTable map[string]*common.JobSchedulePlan // 任务调度计划表
jobExecutingTable map[string]*common.JobExecuteInfo // 任务执行表
jobPlanTable不会触发线程安全性问题可以理解,因为有关于jobPlanTable的都是同步操作下来。
可是jobExecutingTable不会触发线程安全问题一直很疑惑,不知道原因。因为jobExecutingTable在三个地方,分别是1.监听到强杀任务时查询删除jobExecutingTable,2.任务完成返回结果时删除jobExecutingTable,3.开始任务时检查加入jobExecutingTable。他们都通过select,我认为有一个瞬间是正好开始任务时检查加入jobExecutingTable然后同时强杀任务时查询删除jobExecutingTable,造成map同时读写的线程安全问题。
不知道我的想法对不对,希望老师可以解惑,迷惑好久了
写回答
1回答
-
小鱼儿老师
2019-05-14
同学好,因为操作table的只有调度协程,无论是加入还是离开。
执行协程拿走了execute指针,对其进行读写,最终通过channel归还给调度协程,在此期间调度协程是不会操作execute对象的。
00
相似问题