最近,我在几家公司接受了采访,并被问到同样的问题:
“你有N个工作线程只能通过共享内存进行通信,任何其他同步原语都不可用。共享内存包含一个最初为0的计数器,每个线程必须递增一次。另一个线程可能是添加了,除了计数器“
之外,共享内存上还有更多空间换句话说,有多个线程,并且它们对共享资源的访问权限(在这种情况下,计数器,但可以是其他任何东西)必须仅使用共享内存进行同步。
所以我的解决方案如下:
Manager线程伪代码:
while (true) {
if(GRANTED equals FINISHED) {
GRANTED = REQUEST;
}
}
工作线程伪代码:
incremented = false;
while (incremented equals false) {
REQUEST = this thread ID;
if(GRANTED equals this thread ID) {
increment the counter;
incremented = true;
FINISHED = this thread ID;
}
}
问题是这个解决方案是否正常? 还有其他解决方案吗? 此外,这种解决方案不公平,因为工人可能会多次尝试,直到有机会实际增加计数器。如何公平?