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

标签 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];
        }
      }
    }
  };
}

最佳答案

阿鲁兹,

可以贴出完整的代码吗?我怀疑问题出在 NTHREADS 值上。在我的 Ubuntu 机器上,该值设置为 8,这是/proc/cpuinfo 文件中的核心数。在我的机器上启动 8 个“热”线程会占用 100% 的 CPU。内核将为自己的关键进程分配时间片,但一般来说所有其他进程都会缺乏 CPU。

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

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

--马特

关于c++ - 资源密集型多线程杀死其他进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38558550/

相关文章:

c++ - 如何将 $(SRCROOT) 放入字符串中?

c - linux下如何打印出当前进程属于哪些组?

python - 使用线程在 UDP 聊天中使用一个套接字

java - 主线程等待其他线程

c++ - 消除多重继承中的类成员歧义

c++ - 重载类的流插入 (<<) 运算符

c++ - 递归返回类型

c - read() 系统调用页面错误不依赖于文件大小

linux - bash中带空格的回调脚本

java - 如何使用信号量进行信号发送?