假设我有一堆工作线程,并且想避免线程确定谁获得什么工作的时间。线程工作分配的正确性
假设每个线程都有一个与它们相关的号码/ 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的最后一个线程)。
我相信这样的方案不需要锁,是安全的吗?它是否正确?
这一切都取决于您正在使用的编程语言的内存模型来实现这一点。但是,如果使用* [compare和swap](http://en.wikipedia.org/wiki/Compare-and-swap)*,这应该是非常直接的。 – DaoWen
@DaoWen是的,如果CaS是可用的,但我相信我所说的比较写比较应该没有锁定的工作。 – user2541029