我正在尝试实施一个程序,允许最多十个人同时选择一个杯子或汽车。这意味着,当其中一个完成时,另一个人可以自由选择一个物体。人们可以花费的最长时间是5秒。我试图使用一系列任务,但这不起作用,因为选择器在不同的机器上。我可以随时更新数据库,一个人选择一个对象,然后检查数据库中的值,但我认为,这是一个坏主意。我怎么能控制那些线程或选择?
我需要控制/跟踪运行的最大线程数,而不管对象的选择在何处完成。
谢谢
答案 0 :(得分:4)
这听起来不像是线程问题,而是更多的服务器/客户端对象管理器。您可以使用许多方向,但一个简单的解决方案是使用管理每个对象的服务。
/* Common interface each object shares */
public interface IObject { ... }
/* Sharable Object implementing IObject */
public class Cup : IObject { ... }
/* This class would be exposed via WCF or Remoting */
public class ObjectSharer : IObjectSharer {
enum ObjectType { Cup, Car }
IObject GetObject(ObjectType ObjType) { ... }
ReturnObj(IObject) { ... }
}
您必须填写实施内容,但希望这可以为您提供有关如何解决此类问题的一些想法。
在GetObject方法中,jwde建议使用信号量是处理资源管理的好方法,将对象限制为10。
答案 1 :(得分:3)
Semaphore是用于限制资源并发访问次数的惯用数据结构。
示例:
public static class foo
{
private static Semaphore _resources = new Semaphore(_limit, _limit);
private const _limit = 10;
public void Pick()
{
_resources.WaitOne();
doWork();
_resources.Release();
}
}
现在只有10个线程可以doWork()
一次。一旦完成,下一个将开始。
答案 2 :(得分:-2)
很难理解被问到的是什么..
但我认为你想控制你的线程?
在这种情况下,您可以挂起一个可用于同步线程的线程。然而,这可能会导致死锁。