• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Необходимо прервать выполнение некоторой функции, если она выполняется

  • Автор темы WoD
  • Дата начала
Статус
Закрыто для дальнейших ответов.
W

WoD

Необходимо прервать выполнение некоторой функции, если она выполняется дольше определённого времени.

я нашел решение: это создавать поток, и в нём выполнять функцию, и если поток не просигнализировал о завершении - то прерывать его.

Код:
private static EventWaitHandle ewh = new EventWaitHandle(false, EventResetMode.AutoReset);

[MTAThread]
public static void Main()
{
bool b = false;
Thread t;
for (int i = 0; i < 1000; i++ )
{
t = new Thread(new ParameterizedThreadStart(ThreadTest));
t.Start(1000000);
b = ewh.WaitOne(100, true);
if (!b) t.Abort();
}
}
public static void ThreadTest(object data)
{
//do some work
ewh.Set();
}

но так как это необходимо делать до 1000 раз в секунду - то создание нового потока каждый раз очень сильно замедляет работу

кто-нибудь может подсказать как это сделать по другому?


п.с.
я пробовал делать с помощью асинхронных вызовов делегатов - это не замедляет работу, но я не знаю как прервать их выполнение, если они выполняются слишком долго.
пробовал через ThreadPool - та же проблема.
думаю, что как-то можно повторно использовать уже созданный поток(передав ему как-то другие параметры, или через статические переменные), но у меня не получилось.
 
M

mr_ST

Запускать 1000 потоков в секунду? Это нереально. Вообще, стоило бы задачу более детально описать.
 
W

WoD

А чем вам Timer не подходит?
использовать таймер для отчёта времени - ещё как-то можно, но как прервать функцию, которая выполняется слишком долго?.....

Запускать 1000 потоков в секунду? Это нереально. Вообще, стоило бы задачу более детально описать.

естественно это долго, я так и написал, поэтому и спрашиваю можно ли повторно использовать созданный поток, и как его регулировать, или как передавать параметры.
по поводу задачи - куда уж проще и понятнее:

из основного потока вызывается некоторая функция(к ней я доступа не имею) мне нужно, чтобы если эта функция выполняется дольше, допустим пол секунды, прервать её выполнение, и продолжить выполнение основной программы.

притом, хочу заметить, что нормальное время работы этой функции примерно до 10мс, и соответственно она может выполняться 100 - 500 раз в секунду.
 
M

mr_ST

Всё упирается в то что потокам приходится делать аборт и, соответсвенно, создавать новые потоки взамен прибитых. Единственное что приходит в голову:
Есть потокобезопасная очередь "заданий" к-я содержит уже созданные спящие/suspend потоки. Т.е. эдакий своеобразный пул.
Имеем два потока А - главный, который вытаскивает из очереди "задания" и запускает их
B - поток который создает задания и запихиват в очередь. Очередь должна быть фиксированного размера дабы не держать огромное кол-во потоков одновременно.

Рещение на самом деле не ахти т.к.
1) Будет эффективно скорее всего только на многоядерном процессоре (как минимум 2 ядра) и то при условии что наши неконтролируемые фунции не запускают свои потоки.
2) Из-за затрат на синхронизацию и гранулярности переключения контекста потоков может не получиться обеспечить нужный темп выполнения функций. Вряд-ли удастся запускать задания чаще чем одно в 10 мс.
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!