假设我有一堆工作线程,我想避免线程花费时间来确定谁得到什么工作。
假设每个线程都有一个与之关联的数字/ID。有一份工作清单。队列中的每个作业都有一个与之关联的 ThreadID。
ThreadID
1 = Job Available
0 = Job Finished
> 1 = Active ==> ThreadID = ID of thread working on the job
对于要处理作业的线程,它会扫描列表并找到第一个 ThreadID = 1 并尝试接受该作业。
这种方式线程消耗作业。(显然他们会睡觉,需要被正确唤醒,但现在忽略所有这些)
问题是,两个线程可能同时尝试处理同一个工作,这很糟糕。
为了解决这个问题,每个线程只需将它的线程 ID 分配给线程 ID,这将阻止其他线程工作,除非在写入线程 ID 之前读取一个线程。
ThreadID Thread 11 Thread 12 ....
1 ThreadID == 1? Job available
ThreadID == 1? Job available
11 ThreadID = 11 Try to take job
12 ThreadID == 12 Try to take job
ThreadID == 11? Job was taken by another thread
ThreadID == 12? (If no other competing threads then thread 12 got the job)
不确定该表是否有意义,但它显示了两个线程竞争该工作。他们都认为他们有这份工作,但无论哪个线程实际上在 ThreadId 中有他们的编号,都得到了这份工作(这将是最后一个写入 ThreadID 的线程)。
我相信这样的方案不需要锁并且安全吗?它是否正确?