Как выделить период времени для выполнения потока?

#c #recursion #stdthread

Вопрос:

У меня есть класс, выполняющийся в потоке. Но я хочу, чтобы он работал только 10 секунд. Примечание… У меня нет возможности передать какое-либо логическое значение в класс, чтобы остановить выполнение. Итак, как я могу настроить завершение потока через 10 секунд?

Класс, который я тестирую, имеет потенциальную бесконечную рекурсию, которая может иметь место, и бессмысленно позволять ему работать дольше 10 секунд.

 TEST_METHOD(TM_ClientServer_Threads)
{

  bool bDone = false;
  int ii = 0;

  std::thread tCounter([amp;bDone, amp;ii]()
    {
      // Black Box:  can't touch this;  can't pass in a Boolean
      while(true)
      {
        ii  ;
      }
    }
  );

  std::thread tTimer([amp;bDone, amp;tCounter]()
    {
      Sleep(1000);
      bDone = true;  
      // kill the tCounter thread ?       
    }
  );

  
  tCounter.join();
  tTimer.join();

  ii = ii   0; // break point here
}
 

Комментарии:

1. Попросите поток периодически останавливать то, что он делал, и проверять время. Если его десять секунд истекли, он возвращается.

2. » У меня нет доступа к операциям внутри класса» — Ну, тогда вы правы, вам просто нужно «создать другой поток, а затем каким-то образом убить другой поток». Здесь вы не оставляете себе практически никаких вариантов.

3. Похоже, вы уже знаете об этом, но я все равно оставлю это для тех, кто следит: убийство потоков-это абсолютное последнее средство. Есть много вещей, которые вы должны знать о потоке, о том, что происходит в потоке и что происходит в операционной системе, прежде чем вы даже подумаете об этом. И даже если вы это сделаете, все равно будет безопаснее перезапустить всю программу, а не поток.

4. @user4581301: Просто для самого простого примера проблемы, даже если ваш API потоковой передачи неразумно предоставляет средства для уничтожения потоков, если рассматриваемый поток находился в середине new / malloc или delete / free и удерживал блокировку кучи в момент его уничтожения, теперь ничто не может выделить или освободить память в процессе навсегда. Когда вам нужно иметь возможность безопасно завершить выполнение извне, не контролируя внутреннюю часть, единственным безопасным решением является отдельный процесс (когда при уничтожении все ресурсы возвращаются в ОС). На UNIX-подобных, fork инг даже не такой тяжеловес.

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