У меня есть несколько производителей и несколько потребителей. Мой общий ресурс — BlockingCollection. Однако мой код работает, только если у меня есть один потребитель. Я знаю, что это состояние гонки, так как вывод каждый раз разный, когда я запускаю код.
Я думал, что BlockingCollection позаботится обо всей синхронизации и т. д., но это не так.
Как тогда я могу синхронизировать свой общий ресурс между всеми производителями и потребителями?
Вот мой код:
/// <summary>
/// PURE PRODUCER TYPE
/// </summary>
class Caller
{
private BlockingCollection<Call> incommingCalls;
public Caller(BlockingCollection<Call> calls)
{
incommingCalls = calls;
//start the producer thread
Thread thread = new Thread(new ThreadStart(placeCall));
thread.Start();
}
public void placeCall()
{
incommingCalls.Add(myCall);
}
}
/// <summary>
/// CONSUMER
/// </summary>
class Fresher : Employee
{
private BlockingCollection<Call> calls;
public Fresher(BlockingCollection<Call> incalls)
{
calls = incalls;
Thread thread = new Thread(new ThreadStart(HandleCalls));
thread.Start();
}
/// <summary>
///
/// </summary>
public void HandleCalls()
{
while (!incommingCalls.IsCompleted)
{
Call item;
if (incommingCalls.TryTake(out item, 100000))
{
//do something with the call
} //else do nothing - just wait
}
}
/// <summary>
///
/// </summary>
class CallCenter
{
private BlockingCollection<Call> fresherCalls;
private List<Caller> myCallers;
private List<Employee> myFreshers;
public CallCenter()
{
//initial incomming calls to the fresher queue
fresherCalls = new BlockingCollection<Call>();
myFreshers = new List<Employee>();
myCallers = new List<Caller>();
generate_freshers();
//generate to start the producer
generate_callers();
}
/// <summary>
///
/// </summary>
private void generate_freshers()
{
for (int i = 0; i < 1; i++ )
{
myFreshers.Add(new Fresher(fresherCalls, tlCalls, locker2));
}
}
/// <summary>
///
/// </summary>
private void generate_callers()
{
for (int i = 0; i < 20; i++ )
{
myCallers.Add(new Caller(fresherCalls, locker));
}
}
}
BlockingCollection<T>
... В общем, конкретное упорядочение имеет тенденцию резко уменьшать или сводить на нет преимущества, которые вы получаете от параллельного программирования. Проблемы, которые хорошо масштабируются в параллельном пространстве, как правило, относятся к задачам, для которых порядок обработки не имеет значения. - person Reed Copsey   schedule 28.01.2013