不理解为什么不会有线程安全问题

来源: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对象的。

0
0

Go语言开发分布式任务调度 轻松搞定高性能Crontab

分布式系统设计+高并发细节处理,一次性让你“晋级”到位

1136 学习 · 177 问题

查看课程