资源密集型多线程杀死其他进程

时间:2016-07-25 01:31:10

标签: c++ linux multithreading pthreads brute-force

我有一个非常耗费资源的代码,所以我可以将工作负载分成多个pthread。虽然一切正常,但计算速度更快,等等。我猜测的是,处理器核心上的其他进程变得如此缓慢,以至于它们在运行几秒后就会崩溃。

我已经设法杀死Chrome标签,Cinnamon DE甚至整个操作系统(内核?)等随机进程。

代码:(已经很晚了,我太累了,无法制作伪代码,甚至评论......) - 但它是一个强力代码,不是用于破解,而是用于测试密码和/或CPU IPS。

任何想法如何解决这个问题,同时仍保持尽可能多的性能?

static unsigned int   NTHREADS = std::thread::hardware_concurrency();
static int            THREAD_COMPLETE = -1;
static std::string    PASSWORD = "";
static std::string    CHARS;
static std::mutex     MUTEX;

void *find_seq(void *arg_0)
{
  unsigned int _arg_0 =   *((unsigned int *) arg_0);
  std::string *str_CURRENT =  new std::string(" ");

  while (true)
  {
    for (unsigned int loop_0 = _arg_0; loop_0 < CHARS.length() - 1; loop_0 += NTHREADS)
    {
      str_CURRENT->back() = CHARS[loop_0];

      if (*str_CURRENT == PASSWORD)
      {
        THREAD_COMPLETE = _arg_0;
        return (void *) str_CURRENT;
      }
    }

    str_CURRENT->back() = CHARS.back();

    for (int loop_1 = (str_CURRENT->length() - 1); loop_1 >= 0; loop_1--)
    {
      if (str_CURRENT->at(loop_1) == CHARS.back())
      {
        if (loop_1 == 0)
          str_CURRENT->assign(str_CURRENT->length() + 1, CHARS.front());
        else
        {
          str_CURRENT->at(loop_1) =     CHARS.front();
          str_CURRENT->at(loop_1 - 1) = CHARS[CHARS.find(str_CURRENT->at(loop_1 - 1)) + 1];
        }
      }
    }
  };
}

2 个答案:

答案 0 :(得分:1)

Areuz,

你能发布完整的代码吗?我怀疑问题是NTHREADS值。在我的Ubuntu框中,该值设置为8,这是/ proc / cpuinfo文件中的核心数。在我的盒子上开始8'热'线程占用100%的CPU。内核将为其自己的关键进程进行时间片,但通常所有其他进程都会为CPU占用。

检查/ etc / cpuinfo中的最大处理器值,然后至少低一个。我的盒子上的CPU编号是0-7,所以7对我来说是最大的。实际最大值可能是3,因为我的4个核心是超线程。对于完全CPU进程,超线程通常没有帮助。

底线,不要占用所有的CPU,它会破坏系统的稳定性。

- 亚光

答案 1 :(得分:0)

感谢您的回答,特别是Matthew Fisher建议您在另一个系统上尝试。

经过一些试验和错误后,我决定撤回我认为稳定的CPU超频(我有一年多的时间),这解决了这种奇怪的行为。我想我从来没有运行过如此高效的CPU和(我猜测)高效(关于不通过屈服来限制整个CPU)脚本来看到这种情况。

正如Matthew所说,我需要提出一个更好的方法,而不是只是通过while true循环不断检查THREAD_COMPLETE变量,但我希望在评论中解决这个问题。

以下访问者的完整和更新代码位于:pastebin.com/jbiYyKBu