【发布时间】:2013-07-02 03:10:09
【问题描述】:
假设我有一堆工作线程,我想避免线程花费时间来确定谁得到什么工作。
假设每个线程都有一个与之关联的数字/ID。有一份工作清单。队列中的每个作业都有一个与之关联的 ThreadID。
ThreadID
1 = Job Available
0 = Job Finished
> 1 = Active ==> ThreadID = ID of thread working on the job
要让一个线程处理一项工作,它会扫描列表并找到第一个 ThreadID = 1 并尝试接受该工作。
这样线程会消耗作业。 (显然他们会睡觉,需要被正确唤醒,但现在忽略所有这些)
问题是,两个线程可能同时尝试处理同一个作业,这很糟糕。
要解决这个问题,每个线程只需将其线程 ID 分配给线程 ID,这将阻止其他线程处理该作业除非在写入线程 ID 之前读取一个线程。 p>
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 and swap,这应该非常简单。
-
@DaoWen 是的,如果 CaS 可用,但我相信我所说的比较写入比较应该也可以在没有锁定的情况下工作。
标签: multithreading thread-safety