Нужно высчитать кол-во букв в строке. Запускаю несколько потоков которые синхронно считают в заданных местах. В итоге программа не правильно работает. Вопрос, как поставить ожидание основной поток пока не завершаться потоки для поиска. Или может быть проблема в другом. Есть ли вариант, чтобы основной поток, ждал завершения всех потоков, которые работают параллельно, как WaitAll в таске.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Text.RegularExpressions;
namespace ConsoleApplication12
{
class Program
{
static void Main(string[] args)
{
int k = 0;
object locker = new object();
Console.WriteLine("Введите строку для поиска в ней букв");
string p = "ppppppppppppppppppp"; //Console.ReadLine();
Console.WriteLine("Введите букву");
char pattern = 'p';// Console.ReadKey().KeyChar;
//Console.ReadLine();
Console.WriteLine("Кол-во потоков");
int kol_thread = 5;// int.Parse(Console.ReadLine());
int len = p.Length / (kol_thread);
for (int i = 0; i < kol_thread; i++)
{
int endPos;
{
if (i == kol_thread - 1)
endPos = p.Length;
else
endPos = len*(i+1);
}
Thread task3 = new Thread(() =>
{
int r = 0;
for (int z = len * i; z < endPos; z++)
{
//inp += p[z];
if (p[z] == pattern)
r++;
}
lock (locker)
{
k += r;
}
});
task3.Start();
}
//Thread.CurrentThread;//
Threed.Sleep(200);
Console.WriteLine("Кол-во букв в строке: "+k);
Console.ReadKey();
}
}
}
Так же была идея создать массив, и остановить через Join, весь массив не удалось загнать в джоин.
threads[i] = new Thread(() =>
{
int r = 0;
for (int z = len * i; z < endPos; z++)
{
//inp += p[z];
if (p[z] == pattern)
r++;
}
lock (locker)
{
k += r;
}
});
threads[i].Start();
//threads[i].Join();//Получается линейное выполнение потоков
//threads.Join<>//но так остановить массив нельзя
Вы шли в верном направлении, чтобы ждать потоки, надо их куда то сохранить. Только вы ждать поток пробовали в том же цикле, где потоки создавали, а верным будет сначала создать потоки, а потом уже ожидать. Как пример:
var threads = new Thread[kol_thread];
for (int i = 0; i < kol_thread; i++)
{
.......
Thread task3 = new Thread(() =>
{
.....................
});
threads[i] = task3;
task3.Start();
}
for (int i = 0; i < kol_thread; i++)
{
threads[i].Join();
}
Сборка персонального компьютера от Artline: умный выбор для современных пользователей